free(): invalid next size (fast): 0x000000xxx

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值