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

Address Sanitizer无法检测缺失delete的内存泄漏?如何配置实现检测

AddressSanitizer在Visual Studio中能否检测内存泄漏?配置方法说明

我在Visual Studio中为项目启用了AddressSanitizer(ASAN),成功检测出微软Learn文档里的数组越界问题,测试代码如下:

#include <stdio.h>

int x[100];

int main() {
    printf("Hello!\n");
    x[100] = 5; // 数组越界,ASAN可检测
    return 0;
}

但同样启用ASAN的情况下,无法检测到以下代码中因缺失delete导致的内存泄漏:

struct Object {
    int x;
    int y;
};

int main() {
    Object* obj = new Object();
    // 未释放内存,ASAN未检测到
    return 0;
}

已查看Debug/x86配置下的汇编代码,确认new操作未被编译器优化:

; 6    : int main() {

    push    ebp
    mov ebp, esp
    sub esp, 12                 ; 0000000cH
    mov ecx, OFFSET __62A33F1D_Source@cpp
    call    @__CheckForDebuggerJustMyCode@4

; 7    :    Object* obj = new Object();

    push    8
    call    ??2@YAPAXI@Z                ; operator new

核心疑问:AddressSanitizer是否支持检测这类内存泄漏?如果可以,需要怎么配置才能生效?


答案:可以检测,需手动开启内存泄漏检测功能

Visual Studio集成的AddressSanitizer默认不启用内存泄漏检测,仅开启了越界、UAF等内存错误检测。要检测内存泄漏,需额外配置:

  • 方法1:通过项目属性配置

    1. 右键项目 -> 属性
    2. 进入「配置属性 -> C/C++ -> 所有选项」
    3. 找到「AddressSanitizer内存泄漏检测」选项,设置为「是(/INSTRUMENT:MEMORY)」
    4. 保存配置后重新编译运行
  • 方法2:通过编译宏开启
    在项目的所有头文件之前添加以下宏定义:

    #define _ENABLE_ASAN_LEAK_DETECTION 1
    

    重新编译程序后,当程序正常退出时,ASAN会在输出窗口打印内存泄漏报告。

注意事项

  • 仅支持Visual Studio 2019 16.9版本及以上,更早版本的ASAN未集成泄漏检测功能
  • 需使用Debug或ASAN-enabled的Release配置(普通Release优化可能影响检测结果)
  • 程序必须正常退出(通过return或exit),崩溃退出可能不会生成泄漏报告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:11:27