记一次错误
遇到free(): invalid next size (fast): 0x000000xxx问题时,用gdb调试找到错误定位。一般这类问题可能有如下三种情况:
1.内存越界写入,如指针、容器等;
2.free了已经被释放的内存指针,或者释放了没有内存没有申请成功的指针
3.指向free对象的指针不正确,释放的指针不是malloc时返回的指针;
然而需要注意的是,可能内存泄露的并不是调试定位处的对象。其它地方的内存泄露可能没有及时体现出来,在定位处操作内存时程序报错。
解决方法:
可以将定位处以上的某一段必然执行的代码注释掉(改变了代码逻辑,但不要影响后面程序的执行),再次调试会发现错误消失或者错误出现在其它地方。这是因为程序执行时对内存的操作的顺序发生了改变,那么内存泄露出的内存位置也发生了改变。
如果无法定位到错误真正的地方,需要检查每一个全局变量指针、容器,写入数据时是否出现错误操作(重写未清空,越界写入等)。
本人比较菜,没有研究过底层的原理,猜测可能是泄露的内存覆盖到了发生崩溃的对象内存里,导致没有任何违规操作的对象处发生崩溃。
越界写入时,将内容写入到了申请对象内存之外,但一般这块多余的内存你不去用它,程序也不会报错,这就很难受了。
free(): invalid next size (fast): 0x000000xxx
最新推荐文章于 2023-08-19 16:06:33 发布