STL list push_back崩潰

寫代碼過程中,遇到崩潰,崩潰地方是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清零會破壞其值,導致後續的函數操作會崩潰

 

更詳細權威的解釋,需要看各個容器的實現源碼,等有時間可以再研究

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章