标签归档:C++

sort 导致进程崩溃

转载自沙子泥巴刘的博客

前言

最近被一个在sort自定义排序导致的崩溃问题, 弄得焦头烂额. 后在网上看了这篇文章, 才解决问题, 转载一次.

正文

近期我们开发的一个工具在调用c++ sort函数对数组进行排序时居然会导致进程崩溃,此问题细节我觉得对于类似我这种不常用stl的同学可能不容易觉察,这里简单总结下。

出错代码

因为代码太复杂不好展示,我这里就用下面这个简单的示例来描述。

#include <algorithm>

bool comp(int d1, int d2)
{
    return d1 >= d2;
}

const int N = 50;

int main()
{
    int d[N];
    for(int i = 0; i < N; ++i)
    {
        d[i] = 20;
    }

    std::sort(d, d + N, comp);
    return 0;
}

不知你是否直觉上也会觉得这段代码没什么问题,但是这段代码运行后会core dump。查看core文件可以看到内存里的栈被写坏了,这说明sort调用导致了内存越界访问,在这么少的代码行下,不难判定应该是comp函数实现可能不符合c++标准库的某种规则(C++ STL是基于concept的设计和实现)。
继续阅读

ZMQ 高级请求-应答封包解包

我理解的ZMQ

ZMQ不是消息队列, 是一套构建消息队列的组件集合, 它告诉你每个组件有什么特性, 每个组件可以干什么, 至于怎么构建消息队列, 全凭自己决定. 我们可以搭建出同步的, 异步的, 可靠的, 不可靠的, 分布式的, 非分布式的等等. 正是这种灵活的方式, ZMQ才能满足各式各样的需求(借别人一句话:ZMQ就像是一盒积木,只要你有足够的想象力,就可以用它组装出任何造型的网络架构).
继续阅读

时间戳转换日期

前言

时间戳转日期是我们最常用的需求, 一般情况我们会采用系统提供的localtime或localtime_r来转换, 可是localtime是线程不安全的, 而且两个都是通过系统调用来实现的, 如果在大量调用的时候, 会导致整个系统性能低下, 这也就是为什么我们要通过数学的方法转换时间戳.
继续阅读

protobuf协议CSharp应用

最近在整改服务端的私有协议, 使用了protobuf作为新的RPC通信交换格式。以前手机客户端走的是http协议, 连接PHP, 然后PHP又通过ICE与C++服务器做连接, 现在直接用tcp然后用protobuf传输。最近接手了整个手机行情服务器的开发工作,我需要一个稳定的界面测试数据,C++写界面太麻烦,想着直接用C#的winform拖拖控件就好了,于是就有了用C#接protobuf的这篇博文。
继续阅读