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

MSVC下Address Sanitizer与_CrtDumpMemoryLeaks()共存问题

MSVC下/fsanitize=address与/MDd共存时_CrtDumpMemoryLeaks()失效的解决办法

当你在MSVC中同时启用/fsanitize=address(ASAN)和/MDd调试CRT时,会遇到_CrtDumpMemoryLeaks()无法检测内存泄漏的问题——单独用/MDd /Zi编译时正常,加了ASAN就只输出0,核心原因是两套内存跟踪机制互不兼容:

  • ASAN会替换CRT默认的malloc、free等内存分配函数,用自己的实现来跟踪内存操作。这导致CRT的_CrtDumpMemoryLeaks()无法获取到任何内存分配记录,自然输出0。
  • MSDN文档提到ASAN支持/MDd,指的是ASAN可以和调试CRT环境兼容运行,而非两者的内存检测功能可以协同工作。

解决办法

有两种可行的处理方式:

  1. 改用ASAN自带的内存泄漏检测
    ASAN本身内置了内存泄漏检测功能,程序退出时会自动扫描并输出详细的泄漏报告,包括泄漏内存的分配栈、大小等信息,完全不需要调用_CrtDumpMemoryLeaks()。
    编译命令保持cl test.c /fsanitize=address /MDd /Zi即可,运行程序后ASAN会自动输出泄漏详情。

  2. 分开使用两种检测机制

    • 如果必须依赖CRT的_CrtDumpMemoryLeaks(),就移除/fsanitize=address选项,用原命令cl test.c /MDd /Zi编译。
    • 如果需要ASAN更强的内存错误检测能力(比如越界访问、释放后使用等),就放弃CRT的泄漏检测,直接用ASAN的自动报告。

内容的提问来源于stack exchange,提问作者jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:40:30