如何在c++中检测内存泄漏
在Visual Studio系列的IDE中,可以使用_CrtSetDbgFlag
函数来检测内存泄漏:
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// some code ...
return 0;
}
注意,_CrtSetDbgFlag
需要在刚进入main
函数时调用,在_CrtSetDbgFlag(...)
和return 0
之间的所有内存泄漏都可以被检测到,假如有下面的代码:
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int* p = new int(100); // 分配了内存但没有释放
return 0;
}
当程序运行完后,打开Visual Studio的“输出”面板(注意不是控制台的输出),可以看到如下信息:
如果在_CrtSetDbgFlag(...)
和return 0
之间没有内存泄漏,则输出面板不会有任何异常:
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int* p = new int(100); // 分配内存
delete p; // 释放
return 0;
}
_CrtSetDbgFlag
函数只有在Visual Studio系列的IDE中才能使用。那么,假如我们不使用Visual Studio系列的IDE,或者上面的_CrtSetDbgFlag
函数不起作用,该怎么办呢?
其实还有一个很简单的方法,只需要把待检测的代码包裹在一个while (true)
循环中,就像下面这样:
int main()
{
while (true)
{
// 怀疑有内存泄漏的代码...
}
return 0;
}
然后,运行程序,并打开任务管理器,观察一下内存占用的曲线是否直线上升。