首先看下问题提示
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的监视窗口顺利找到出问题的内存块对应的对象。 当然可能可以通过一些工具方便做到这点吧…继续加油..