_CrtDumpMemoryLeaks()会在调用时检测 此时刻 是否还有没释放的内存,如果有则报错返回。一般用于程序结束时调用,用于检测是否有内存没有释放(言外之意:内存泄漏了)
#include <crtdbg.h>
#ifdef _DEBUG //debug编译都是打开的
#define _CRTDBG_MAP_ALLOC //打开堆内存调试的开关(堆内存操作附加了额外信息:文件名,行号等)
但是测试中new并没有输出额外行号等信息,可能是_CRTDBG_MAP_ALLOC比new定义之后才定义?
不如直接使用如下宏定义:
#define new new(_NOMAL_BLOCK, __FILE__, __LINE__)
#define malloc(size) _malloc_dbg(size, _NOMAL_BLOCK, __FILE__, __LINE__)
确保有行号输出。
_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) //获取当前的flag值,有两个开关是默认打开的,重新设置时必须先拿出这些默认值再bit运算后,重新用_CrtSetDbgFlag设置新开关, _CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF
_CrtSetReportFile( int reportType, reportFile ); //Report type: _CRT_WARN, _CRT_ERROR, _CRT_ASSERT , 将输出的信息保存到文件,一般用于服务器类型的软件。
1. 程序运行时: _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
此时就不用程序自己显式调用_CrtDumpMemoryLeaks()了,程序结束后系统会帮我们调用。如果程序员自己调用该函数,则比较难找到合适的地方:放在main尾,那么分配的全局变量此时还没有释放,会误报全局变量内存泄漏。 而放在全局变量的释放时回调,又不知道哪一个是最后释放内存的。
总结:
#define
_CRTDBG_MAP_ALLOC ---> _CrtSetDbgFlag 就可以了,我们甚至没见到_CrtDumpMemoryLeaks在哪里,但是我们已经使用上了
本文介绍了如何使用_CrtDumpMemoryLeaks检测C语言程序中的内存泄漏。通过设置_CrtDbgFlag,配合_CrtSetReportFile,可以在程序运行时或结束时自动检查内存泄漏,并通过调试信息定位问题。建议在DEBUG模式下使用_CRTDBG_MAP_ALLOC和相关宏定义来确保内存分配时记录文件和行号。
6900

被折叠的 条评论
为什么被折叠?



