网站编写费用,做解密类网站可行,阜创汇网站建设名额,学网站建设的好处接手项目原有代码#xff0c;在昨天接到bug提示#xff0c;一条数据处理时程序崩溃#xff0c;于是有了这个查找问题的小总结。
gdb调试时问题定位到#xff1a;malloc(): smallbin double linked list corrupted#xff0c;然后看了那块儿的代码#xff0c;并没有发现有…接手项目原有代码在昨天接到bug提示一条数据处理时程序崩溃于是有了这个查找问题的小总结。
gdb调试时问题定位到malloc(): smallbin double linked list corrupted然后看了那块儿的代码并没有发现有问题于是进入c冥想时刻c是一个神奇的语言很多崩溃问题出现的地方并不是真实的就好比一个人后背总疼贴了膏药拍了片子都没发现问题后来医生会诊内科说这是心梗的前兆问题在于血管堵塞于是病好了背不疼了。于是结束冥想一路向前查找代码发现很早的一个数据处理的地方有多次的vector扩容当然这个本身没有问题这个是vector的一个机制当空间不够用时它会进行以下操作 1、寻找更大空间 2、将原数据复制过去 3、释放原空间 那么就需要提前reserve预留空间提高效率在这个代码里原作者同样做了reserve但是由于数据不规整就是与原作者的理想状态有点差异导致了reserve的空间依然不足就多次进行了另外的扩容多次的申请空间释放空间会产生内存碎片于是乎在后面代码中同样进行多次申请与释放的时候就出现申请的内存不够失败的问题。 关于vector扩容使用了一个测试代码
void FillVector(vectorBigTestStruct 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倍。
以上有问题请指正谢谢