当一个静态代码分析软件没有抱怨构造函数中的内存泄漏时,我很感兴趣。任何输入都会有所帮助。请注意,它不是班级成员。它是ctor中的本地指针
class ABC
{
public:
ABC()
{
int *p = new int[10];
//No delete invoked...
}
};
答案 0 :(得分:2)
您实际上并不需要静态分析工具。海湾合作委员会已经移植了LLVM's sanitizer,并且从GCC 4.9开始提供。它显然也是Clang的一部分。
✿'‿`)〜/ test> g ++ - trunk -fsanitize = undefined,address,leak -std = c ++ 11 test.cpp -g -Wall -Wextra -pedantic
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是您的朋友。