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

ASAN未检测到placement new内存泄漏:是特性还是Bug?

这是ASAN的特性还是Bug?

以下为测试代码:

class Foo {
    int x = 5;
    int z = 10;
};

int main() {
    void *memory = malloc(sizeof(Foo));
    Foo *ptr = new(memory) Foo();
    ptr = nullptr;
}

ASAN未报告任何泄漏。但移除Foo *ptr = new(memory) Foo();语句后,ASAN检测到泄漏:

Direct leak of 8 byte(s) in 1 object(s) allocated from:
0x7f00b7a80a89 __interceptor_malloc asan_malloc_linux.cpp:69 
0x55dfa164d1ca main main.cpp:12 
0x7f00b74a72cf (libc.so.6+0x232cf) 

环境信息

  • 编译环境:GCC 12.2.0
  • 编译命令:
    [1/2] /usr/sbin/c++   -g -fsanitize=address -fsanitize=leak -std=gnu++14 -MD -MT CMakeFiles/test.dir/main.cpp.o -MF CMakeFiles/test.dir/main.cpp.o.d -o CMakeFiles/test.dir/main.cpp.o -c /src/self/test/main.cpp
    [2/2] : && /usr/sbin/c++ -g -fsanitize=address -fsanitize=leak CMakeFiles/test.dir/main.cpp.o -o test   && :
    
  • 操作系统:Linux WORKSTATION 5.19.4-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC Thu, 25 Aug 2022 17:31:19 +0000 x86_64 GNU/Linux

结论:这是ASAN的特性,而非Bug

当使用placement new(new(memory) Foo())时,ASAN会将malloc分配的原始内存块与构造出的Foo对象建立关联。ASAN的泄漏检测逻辑会追踪C对象的生命周期,即便你没有显式调用析构函数或free释放内存,ASAN也会认为这块内存已被C对象接管,不会标记为泄漏。而移除placement new语句后,malloc分配的内存没有关联任何C++对象,ASAN就会正常识别出这是未释放的内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:06:27