如何在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的“输出”面板(注意不是控制台的输出),可以看到如下信息:

img1

如果在_CrtSetDbgFlag(...)return 0之间没有内存泄漏,则输出面板不会有任何异常:

int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

	int* p = new int(100); // 分配内存
	delete p;              // 释放

	return 0;
}

img2

_CrtSetDbgFlag函数只有在Visual Studio系列的IDE中才能使用。那么,假如我们不使用Visual Studio系列的IDE,或者上面的_CrtSetDbgFlag函数不起作用,该怎么办呢?

其实还有一个很简单的方法,只需要把待检测的代码包裹在一个while (true)循环中,就像下面这样:

int main()
{
	while (true)
	{
		// 怀疑有内存泄漏的代码...
	}

	return 0;
}

然后,运行程序,并打开任务管理器,观察一下内存占用的曲线是否直线上升。

posted @ 2021-03-04 19:07  baiyuxuan  阅读(445)  评论(0编辑  收藏  举报