在对象被销毁前要避免对象的成员变量成为野指针

最近的一个项目,偶然会出现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,一个功能明确的函数没必要多做不是自己功能的事。所以有时候做的多不一定就好啊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值