_CrtDumpMemoryLeaks未打印内存泄漏信息的问题求助
_CrtDumpMemoryLeaks未打印内存泄漏信息的问题求助
你好呀!看了你的问题和代码,我猜你肯定盯着控制台窗口找泄漏信息呢?哈哈,先给你说个最容易踩的坑——内存泄漏的报告根本不是输出到程序的控制台,而是Visual Studio的「输出」窗口!
先确认下你的情况:你用VS2022 LTSC 17.4的Debug模式,已经通过PI输出22确认了_DEBUG宏生效,代码里用malloc分配了内存却没释放,但调用_CrtDumpMemoryLeaks()后看不到泄漏提示对吧?
咱们一步步解决:
1. 先找对输出位置
你的代码里设置了_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG),这个参数是把警告信息发送到调试器的输出窗口,不是程序运行的黑框框。你可以通过VS菜单栏的「视图」→「输出」打开这个窗口,等程序运行结束后,里面会清晰显示内存泄漏的详细信息,包括泄漏的内存大小、分配位置这些。
2. 优化泄漏检测的设置(可选但更靠谱)
手动调用_CrtDumpMemoryLeaks()有时候会因为调用时机的问题(比如某些全局对象销毁时释放了内存)导致检测不准,推荐用_CrtSetDbgFlag让CRT在程序退出自动检测泄漏,这样更可靠。我给你修改了代码,还加了让信息同时输出到控制台的设置:
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #include <iostream> #ifndef _DEBUG /* For RELEASE builds */ #define PI 3.14 #else /* For DEBUG builds */ #define PI 22 #endif int main() { // 启用自动内存泄漏检测,程序退出时自动触发 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // 让泄漏信息同时输出到调试窗口和程序控制台 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); int* ptr = (int*)malloc(sizeof(int) * 5); for (int i = 0; i < 5; i++) { ptr[i] = (i+1) * 10; } for (int i = 0; i < 5; i++) { std::cout <<"\n"<< ptr[i]; } std::cout << "\nPI : " << PI; // 现在不需要手动调用_CrtDumpMemoryLeaks()了,自动检测会处理 }
3. 额外小提醒
如果你还是想用手动调用的方式,要确保_CrtDumpMemoryLeaks()在所有分配的内存被释放之前执行——你的代码里这点是对的,因为ptr没有被free,所以问题核心还是输出位置的问题。
按照上面的方法试试,你肯定能找到内存泄漏的报告啦!
备注:内容来源于stack exchange,提问作者Vijay Nerkar
相关产品推荐
相关产品推荐

