在调试MFC程序时,在应用程序入口函数所在的模块(.cpp)加入如下语句:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在应用程序入口函数中加上如下语句:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
程序退出时,如果有内存泄漏,Debug Output窗口会输出类似下面的带原文件名和行号信息:
非MFC程序可以用_CrtDumpMemoryLeaks()函数检测内存泄漏,但无法输出代码行信息:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
如何能够显示内存泄漏的代码行呢?方法是重新定义new如下,以便告诉compiler使用debug版本的operator new()方法:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
相关的CRT源代码位置:
CRT/SRC/dbgnew.cpp
DCRT库的各个标记
_CRTDBG_ALLOC_MEM_DF :
开启heap分配功能,并使用内存快标识符。这是在默认状态下唯一的一个标记。
_CRTDBG_CHECK_ALWAYS_DF :
检查并验证各个分配地址上的所有内存和释放内存分配请求。打开这个标记能够在任何内存保护和内存覆盖发生时尽可能快地捕捉到他们。
_CRTDBG_CHECK_CRT_DF :
将_CRT_BLOCK内存分配包括到所有的内存泄露检测和状态区别中。通常情况下,除非有一个CRT库函数有问题,否则最好不要打开这个标记。如果打开了这个标记,就会得到各个CRT库内存分配报告。因为直道程序真正结束之前,CRT库必须保证分配了一些内存。而程序结束是在内存泄露报告之后,所以,你将会看到大量关于该内存的假的绝对内存泄露报告。
_CRTDBG_DELAY_FREE_MEM_DF :
不是真正释放内存,而是保留分配的内存块并保留内部的heap列表。该内存被值0xDD覆盖,因此当你在调试器中查看时,就会知道该内存已经释放了。不释放该内存,则使用该标记可以在内存强调条件下测试程序。除此之外,通过确保该内存中的所有置仍旧是0xDD,DCRT库可以检查你确实没有再次访问这个已解除分配的内存块。应始终打开这个标记,但是要切记能够轻易地加倍程序的内存需求,因为分配的能存没有被heap重新使用。
_CRTDBG_LEAK_CHECK_DF :
检查程序末端的内存泄露。打开这个极其有用的标记是必须的。