学习C++有一段时间了,c++中指针是十分好用的工具,也一直听大家将存在风险,使用稍不慎就会导致野指针(指空);虽然一直明白,但从未真正遇到过此类问题。最近在用Qt做一个程序时,真正的领略了一把野指针带来的危害,真是打脸之后,才领悟到其中真谛(痛的领悟)
描述一下背景:
程序的一个大概结构:在主界面中实例化了一个进度对话框和图形浏览器;在图形浏览器下实例化了一个图形处理任务;该图像处理实例下又有几个小的算法实例构成。
为增强用户体验:在执行图形处理任务时候,开启进度对话框;采取策略是把进度对话框的指针一层层传递到任务算法中,在建立信号槽连接(直接传递信号没有传递指针来的轻巧;而且进度对话框的生命周期与程序一样长的,所以原本认为应该是绝对安全的);
描述问题:
整个程序在运行期间没有任何问题,在关闭程序的时候,会出现程序崩溃
Qt error: Exception at 0x58083aea,: read access violation at: 0x0, flags=0x0 (first
解决:
想了一下,肯定是析构时候出了问题。然后再回头去看程序的析构顺序,发现了大问题,竟然先把进度对话框析构掉了,然后再析构的图像处理任务实例;这必然会造成野指针;这还不是程序奔溃的主要原因;主要原因是,在析构图像处理任务实例时候,还调用了这个野指针来断开信号槽连接;然后就没有然后,直接就泪奔了;
痛的领悟:
指针是好用,还是要绝对小心;使用指针一定要确保指针还是正确指向目标对象。还有野指针不是最可怕,最可怕他是野指针了 你还去调用它。