我正在做一个 c++ 项目。我试图从 RC Purify 中找出内存泄漏,但没有得到令人满意的输出。我计划要么在所有构造函数和析构函数中写入日志以验证内存泄漏,要么尝试找出一些可以这样做的插件。
2 回答
不是真正的插件,但您可以通过添加基础对象计数器来检测您的类:
template <typename T>
struct Counter {
static atomic_int alive;
Counter() {
++alive;
}
~Counter() {
--alive;
}
};
template <typename T>
atomic_int Counter::alive = 0;
然后对于每个检测类:
class Instrumented : Counter<Instrumented> // CRTP
{ ... };
在代码中,您可以使用:
std::cout << Counter<Instrumented>::alive << std::endl;
查看有多少类型的对象Instrumented
已创建但未销毁。
请注意,这是一个穷人的选择,它会产生比 Purify 或 valgrind 之类的工具更差的结果(即它只跟踪被检测的对象,并且不会检测由于错误编写的析构函数或内部指针的错误重置而丢失的内存,它是侵入性,您必须显式添加代码才能获得结果-或使用调试器...)但我过去曾使用它来帮助理解某些问题。
您可以使用 WinDbg 尝试查找内存泄漏,从此处下载:http: //msdn.microsoft.com/en-us/windows/hardware/gg463009,在命令提示符或调试中为泄漏的应用程序打开 gflags 用户堆栈跟踪工具命令提示符:
gflags /i MyApp.exe +ust
然后,您可以从 WinDbg 附加或启动您的应用程序,在 WinDbg 的命令提示符处输入:
.symfix;.reload;g
然后,当您的应用程序运行到足以发生泄漏时,请返回 WinDbg 按ctrl+break
然后输入!heap -l
,它会尝试为您查找泄漏。这里有一个很好的演练:http: //www.codeproject.com/Articles/31382/Memory-Leak-Detection-Using-Windbg和http://cprogrammers.blogspot.co.uk/2006/09/windows-memory -leak-analysis-using.html。
也可能是句柄泄漏,在这种情况下,当 WinDbg 附加时输入:
!htrace -enable
这将启用句柄跟踪并拍摄快照,然后在您的应用程序中执行一些操作,在 WinDbg 中中断ctrl+Break
并输入!htrace -snapshot
,然后!htrace -diff
它将列出自上次快照以来尚未释放的所有句柄。祝你好运。