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:通过项目属性配置
- 右键项目 -> 属性
- 进入「配置属性 -> C/C++ -> 所有选项」
- 找到「AddressSanitizer内存泄漏检测」选项,设置为「是(/INSTRUMENT:MEMORY)」
- 保存配置后重新编译运行
方法2:通过编译宏开启
在项目的所有头文件之前添加以下宏定义:#define _ENABLE_ASAN_LEAK_DETECTION 1重新编译程序后,当程序正常退出时,ASAN会在输出窗口打印内存泄漏报告。
注意事项
- 仅支持Visual Studio 2019 16.9版本及以上,更早版本的ASAN未集成泄漏检测功能
- 需使用Debug或ASAN-enabled的Release配置(普通Release优化可能影响检测结果)
- 程序必须正常退出(通过
return或exit),崩溃退出可能不会生成泄漏报告
内容的提问来源于stack exchange,提问作者sanitizedUser
相关产品推荐
相关产品推荐

