HEAP: HEAP: Free Heap block xx modified at xxafter it was freed 堆内存出现野指针错误

首先看下问题提示:

HEAP[SimEng.exe]: HEAP: Free Heap block 000002CA51FC08A0 modified at 000002CA51FC0950 after it was freed

Ok,碰到这种xxxx地址的报错提示就慌得一批。

解答

经过一种暴力式解谜,找到以下的原因(解谜过程不建议也不见得能复用,基本上就是看堆栈,“偶然”看到有熟悉的名字就去找到用到的地方,然后一点一点注释,然后找不同,极其低效QAQ):
原因:
关闭窗口,开始执行析构:
1.从mainwindow开始析构:
在这里插入图片描述
2.析构它的孩子(m_osgwidget):
在这里插入图片描述
在这里插入图片描述
3.析构其他孩子(MAP_OSG_LayerControlWidget):
在这里插入图片描述
在这里插入图片描述

真相只有一个:3中析构调用了2中已经被析构的指针!
据说Qt对象树的析构并不能指定顺序 所以在Qt对象的析构中不能调用兄弟指针。

解决方案:
注释掉3.中析构这调用就行了,要用可以写个closeEvent方法保险一些。

后言

这里只是提供了关于内存出错的一种经验,毕竟C++内存管理是非常复杂而且技术多样的地方。这里由于是在程序退出,执行析构的时候出现的错误(堆内存释放),所以出现野指针的问题跟一般情况有些出入,对比普通的野指针异常更难发现问题了(在看堆栈的时候全是qt内存管理机制,看不懂…)。总之出现问题还是多翻看自己的代码(也可能是别人的,笑)

反思:
暴力破解问题的思路实属不可取,效率低效之余全靠运气QAQ
据说可以通过重写new和delete的操作,记录分配的内存,然后写一个查询函数,即可通过vs的监视窗口顺利找到出问题的内存块对应的对象。
当然可能可以通过一些工具方便做到这点吧…继续加油…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值