接手项目原有代码,在昨天接到bug提示,一条数据处理时程序崩溃,于是有了这个查找问题的小总结。
gdb调试时问题定位到:malloc(): smallbin double linked list corrupted,然后看了那块儿的代码,并没有发现有问题,于是进入c++冥想时刻:c++是一个神奇的语言,很多崩溃问题出现的地方并不是真实的,就好比一个人后背总疼,贴了膏药拍了片子都没发现问题,后来医生会诊,内科说这是心梗的前兆,问题在于血管堵塞,于是病好了,背不疼了。于是结束冥想,一路向前查找代码,发现很早的一个数据处理的地方有多次的vector扩容,当然这个本身没有问题,这个是vector的一个机制,当空间不够用时,它会进行以下操作:
1、寻找更大空间
2、将原数据复制过去
3、释放原空间
那么,就需要提前reserve,预留空间,提高效率,在这个代码里,原作者同样做了reserve,但是由于数据不规整,就是与原作者的理想状态有点差异,导致了reserve的空间依然不足,就多次进行了另外的扩容,多次的申请空间,释放空间,会产生内存碎片,于是乎,在后面代码中同样进行多次申请与释放的时候,就出现申请的内存不够,失败的问题。
关于vector扩容,使用了一个测试代码:
void FillVector(vector<BigTestStruct>& testVector, int vsize)
{for (int i = 0; i < vsize; i++){BigTestStruct bt;testVector.push_back(bt);cout << testVector.capacity() << endl;}
}
主要就测试扩容规则,在vs和linux中是不太一样的,vs中是1.5倍,Linux下是2倍。
以上,有问题请指正,谢谢!