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

为何ASAN无法检测new后未执行delete导致的内存泄漏?

问题描述

我正在构造内存泄漏场景以使用*ASAN(AddressSanitizer)*检测内存泄漏,操作步骤如下:

$ export MallocNanoZone='0' # 避免OS X上的相关问题
$ cat new_delete.cc
class Dummy {
    public:
        Dummy(int x) {
            sz = x;
        }
    private:
        int sz;
};

void func(int i) {
    Dummy* p = new Dummy(i);
    if (i < 50) {
        // 从这里返回的话,堆上会有内存泄漏,Dummy对象未被释放
        return;
    }
    // 执行其他操作
    delete p;
}

int main() {
    func(10);
}
$ clang++ -fsanitize=address -g -O0 new_delete.cc
$ ./a.out

我原本预期ASAN能检测到该内存泄漏,但实际并未检测到。请问我忽略了什么?

我使用的是OS X系统,clang版本信息如下:

$ clang++ --version
Apple clang version 12.0.0 (clang-1200.0.32.28)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
解决方案

在OS X系统上,ASAN默认不会自动启用内存泄漏检测功能,你需要显式开启它。修改运行命令,添加ASAN_OPTIONS=detect_leaks=1环境变量:

ASAN_OPTIONS=detect_leaks=1 ./a.out

原因是ASAN的泄漏检测模块属于可选组件,在OS X平台默认未激活,必须通过该环境变量显式开启后,才能捕获到你代码中的内存泄漏场景。

此外,Apple Clang 12.0.0对应的ASAN对小对象泄漏的检测是正常的,你的Dummy对象内存大小足够触发检测,启用该选项后就能看到预期的泄漏报告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:35:23