内存泄漏快速定位方法

 

主要方法:利用系统带的函数:EnableMemLeakCheck() 和 函数重载,能快速准备的定位到内存泄漏的地方,方法简单且实用,值得借用。

     


#include <crtdbg.h>

#ifdef _DEBUG     //重载一下new函数,这样能得到使用new 开辟空间而发生泄漏的文件和所在行,这就是定位
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif


void EnableMemLeakCheck()   //用于检测是否有内存泄漏。
{

   _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_LEAK_CHECK_DF);

}

void main()
{
   EnableMemLeakCheck();
   int *leak = new int[10];
}

运行后得到的消息:

Loaded 'C:/WINNT/System32/ntdll.dll', no matching symbolic information found.
Loaded 'C:/WINNT/system32/kernel32.dll', no matching symbolic information found.
Detected memory leaks!
Dumping objects ->
D:/DS_Learn/meleak/test1.cpp(19) : {39} normal block at 0x00430120, 40 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The thread 0x91C has exited with code 4391200 (0x430120).
The program 'D:/DS_LEARN/meleak/Debug/meleak.exe' has exited with code 4391200 (0x430120).

很快就能定位到内存泄漏的地方。

我原来也利用相关的方法,在C代码中,重载malloc 和 free,也能很好的检测有没有内存泄漏和发生泄漏的地方,方法都很简单,其实自己在写代码注意一下结构,还是很容易避免发生内存泄漏。

    平时喜欢用这样的结构:

    projectname_init();  //在初始化时,开辟好空间,对project中一些变量,如结构体开辟空间

    projectname_process();  //作相关的处理

    projectname_uninit();     //结束程序运行,释放所以动态分配的空间。

发布了23 篇原创文章 · 获赞 3 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章