在对象被销毁前要避免对象的成员变量成为野指针
2015-07-04 11:03
357 查看
最近的一个项目,偶然会出现HEAP:Free Heapblock XXXX modified at XXXX after it was freed的错误。这个错误并不一定会出现,而且XXXX 还每次都不同,给debug带来很大的麻烦,网上很多大神都说过很多方法,比如GFlags、重载new等等,我比较愚笨,试过重载new却不是很管用。于是我用了最笨的方法,缩减运行的代码,只运行最有可能出现问题的代码,一遍遍的试。然后我发现了另一个内存泄露的地方...
花了很多时间处理上面问题之后,发现野指针不是那里的原因,又换另一个有可能出现的模块。这次定位到就是这个模块之后,由于我之前也知道这个模块在退出的时候可能会有点问题,我就在所有与退出有关的地方设了断点。
最后发现是在一个类A的对象的负责读文件的函数在读完文件之后将读文件的对象B就释放了,但在释放完之后还会setEvent告诉阻塞的进程已经读完了。而在setEvent之前,读文件的函数已经通过回调告诉其它线程的函数已经读完了,那个线程于是就开始delete A这个对象。而偏偏A的析构是根据B是否被释放判断是否进行释放资源的,所以就造成了A已经被释放了,但读文件的函数还在记性, 于是setEvent在释放A之后被执行,就bug了。
这个问题要解决1,析构函数里面要改成阻塞等setEvent,然后读文件函数也不应该读完之后释放B,一个功能明确的函数没必要多做不是自己功能的事。所以有时候做的多不一定就好啊
花了很多时间处理上面问题之后,发现野指针不是那里的原因,又换另一个有可能出现的模块。这次定位到就是这个模块之后,由于我之前也知道这个模块在退出的时候可能会有点问题,我就在所有与退出有关的地方设了断点。
最后发现是在一个类A的对象的负责读文件的函数在读完文件之后将读文件的对象B就释放了,但在释放完之后还会setEvent告诉阻塞的进程已经读完了。而在setEvent之前,读文件的函数已经通过回调告诉其它线程的函数已经读完了,那个线程于是就开始delete A这个对象。而偏偏A的析构是根据B是否被释放判断是否进行释放资源的,所以就造成了A已经被释放了,但读文件的函数还在记性, 于是setEvent在释放A之后被执行,就bug了。
这个问题要解决1,析构函数里面要改成阻塞等setEvent,然后读文件函数也不应该读完之后释放B,一个功能明确的函数没必要多做不是自己功能的事。所以有时候做的多不一定就好啊
相关文章推荐
- php中 $$str 中 "$$" 的解释
- C语言学习_查找三分之二
- Axure快速原型教程01--原型说明下载和安装
- Spring整合JMS-基于activeMQ实现(一)
- excel使用正则表达式
- 要求输出10个学生3门课总平均成绩,以及最高分的学生的数据
- Unity3D制作飘动旗帜代码
- Eclipse中插件的使用:maven /ant /tomcat
- [JAVA]清洗latex数据
- Eclipse中插件的使用:maven /ant /tomcat
- BZOJ3676 [Apio2014]回文串
- 外键的优缺点
- Unity3D制作流动的水面
- C & C++ 宏与const
- usermod -g和gpasswd -a的区别
- 重启OSPF进程的小窍门
- Ubuntu14.04怎么安装vim?
- 从天龙八部论嵌入式行业中个人与企业的核心竞争力
- MySQL详解(10)----------索引优化
- 周记 2015.07.04