构造函数中的本地内存泄漏

Local memory leak in constructor

本文关键字:内存 泄漏 构造函数      更新时间:2023-10-16

当一个静态代码分析软件没有抱怨构造函数中的内存泄漏时,我很感兴趣。任何输入都会有所帮助。请注意,它不是类成员。它是 ctor 内的本地指针

class ABC
{
    public:
        ABC()
        {
            int *p = new int[10];
            //No delete invoked...
        }
};

你真的不需要静态分析工具。GCC已经移植了LLVM的消毒剂,并且从GCC 4.9开始可用。它显然也是叮当的一部分。

✿'‿') ~/test> g++-trunk -fsanitize=undefined,address,leak -std=c++11 测试.cpp -g -墙壁 -额外 -迂腐

test.cpp: In constructor ‘ABC::ABC()’:
test.cpp:6:18: warning: unused variable ‘p’ [-Wunused-variable]
             int *p = new int[10];
              ^

(✿'‿') ~/test> ./a.out

=================================================================
==1713==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 40 byte(s) in 1 object(s) allocated from:
    #0 0x7f2535b07919 in operator new[](unsigned long) ../../../../trunk/libsanitizer/asan/asan_new_delete.cc:62
    #1 0x4008cb in ABC::ABC() ~/test/test.cpp:6
    #2 0x400856 in main ~/test/test.cpp:13
    #3 0x31a1c21d64 in __libc_start_main (/lib64/libc.so.6+0x31a1c21d64)
SUMMARY: AddressSanitizer: 40 byte(s) leaked in 1 allocation(s).

这是一个运行时工具,但对于这种情况,它工作得很好。当然,也总是有valgrind,但你不能同时使用两者。在使用valgrind之前,请先禁用消毒剂。最后但并非最不重要的一点是,gdb 是您的朋友。