平常编写C代码时,如果忘记释放已分配的内存,就会造成内存泄漏,这时我们有两种方法确认造成内存泄漏的位置,第一种是直接检查代码中所有涉及到内存分配的地方是否最后都进行释放了,这种方法的缺点在于在代码量较大时手工检查工作量较大,如果使用了第三方库,一方面我们可能对库何时分配了内存不甚了解,另一方面单独检查每个分配内存的函数也较为繁琐。第二种方法是借助 Visual Studio 调试器和 C 运行时 (CRT) 库。使用方法如下:
#define _CRTDBG_MAP_ALLOC
#include "stdlib.h"
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
char *p = (char *)malloc(sizeof(char) * 10);
return 0;
}
定义相关的宏,包含头文件crtdbg.h,在主函数最前面调用_CrtSetDbgFlag函数,将项目配置为debug模式,最后按F5即可,此时可以看到下方输出中显示了内存泄露的大小,内存泄漏代码所在行数和对应内存的前16个字节值,如下图:
参考: