You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:38:03