寫代碼過程中,遇到崩潰,崩潰地方是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清零會破壞其值,導致後續的函數操作會崩潰
更詳細權威的解釋,需要看各個容器的實現源碼,等有時間可以再研究