写代码过程中,遇到崩溃,崩溃地方是queue的front(),检查了所有代码,未找到原因

后来尝试改为list,结果list 的push_back()数据,就会崩溃,后来找到原因,以下为主要代码,备份一下,以防再犯类似错误
不应该对STL的容器执行memset 清零

typedef struct _Source
{
    char name[128];
    uint64_t time;
    std::list<Data*> dataList;

    _Source()
    {
        memset(name,0,128);
        time = 0;
    }
}Source;

Source *source = new Source;
memset(source,0,sizeof(Source));//罪魁祸首

Data *data = new Data;
source->dataList.push_back(data);//崩溃

原因:分配了结构体指针后,memset清零里面的数据,把队列成员对象也清0了,

int size = sizeof(std::queue<char>); //x64 = 48   win32=24    vs2010下测试

int size = sizeof(std::list<char>); //x64 = 24   win32=12    vs2010下测试

从大小来看,容器对象内部有定义一些分配内存的结构

memset清零会破坏其值,导致后续的函数操作会崩溃

 

更详细权威的解释,需要看各个容器的实现源码,等有时间可以再研究

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐