查找由智能指针引起的内存泄漏
有人知道一种“技巧”来发现由智能指针引起的内存泄漏吗? 我目前正在使用C ++编写的大型项目中大量使用智能指针和引用计数。 显然,我们有一些由智能指针引起的内存泄漏,这些内存泄漏仍然在代码中引用,所以它们的内存不会被释放。 用“不需要的”引用找到代码行非常困难,这会导致相应的对象不被释放(尽管它不再使用)。
我在网络上发现了一些建议,建议收集引用计数器的增量/减量操作的调用堆栈。 这给了我一个很好的提示,哪段代码引起了参考计数器的增加或减少。
但我需要的是将相应的“增加/减少调用堆栈”分组在一起的某种算法。 删除这些调用堆栈之后,我希望至少有一个“增加调用堆栈”剩下的部分,它向我展示了带有“不必要”引用的代码段,从而导致相应的对象不被释放。 现在解决泄漏问题不会有什么大不了的!
但是有没有人想过一个能够进行分组的“算法”?
开发发生在Windows XP下 。
(我希望有人明白,我试图解释什么......)
EDIt:我正在谈论循环引用引起的泄漏。
请注意,具有引用计数智能指针的泄漏源之一是具有循环依赖关系的指针。 例如,A有一个指向B的智能指针,B有一个指向A的智能指针。A和B都不会被销毁。 你将不得不寻找,然后打破依赖。
如果可能的话,使用boost智能指针,并将shared_ptr用作应该是数据所有者的指针,而weak_ptr用于不应该调用delete的指针。
我这样做的方法很简单: - 在每个AddRef()记录调用堆栈上,匹配Release()将其删除。 这种方式在程序结束时,我留下了AddRefs()而没有发布。 无需匹配对,
如果你能够以确定性的方式重现泄漏,我常用的一个简单技巧就是按照其构建顺序对所有智能指针进行编号(在构造函数中使用静态计数器),并将该ID与泄漏一起报告。 然后再次运行该程序,并在具有相同ID的智能指针构造时触发DebugBreak()。
你也应该考虑这个伟大的工具:http://www.codeproject.com/KB/applications/visualleakdetector.aspx
链接地址: http://www.djcxy.com/p/86055.html