为什么cppcheck
无法检测到像这个例子那样的程序中的内存泄漏,其中堆指针的所有权被传递给一个无法释放它的函数?
#include <stdlib.h>
void func(char *xx)
{
// do nothing
}
int main(void)
{
char *p = malloc(1000);
func(p);
return 0;
}
如果我删除了对func(p)
的调用,那么cppcheck会检测到泄漏。
答案 0 :(得分:0)
我正在使用Cppcheck 1.69,这正确地通知我存在内存泄漏。我有以下代码:
#include <stdlib.h>
void func(char *xx)
{
// do nothing
}
int main(void)
{
char *p = (char*)malloc(1000);
func(p);
return 0;
}
请注意,我已将malloc
转换为char*
进行编译,但我尝试使用您发布的完全相同的代码来使用Cppcheck,但它仍然正确告诉我有一个记忆泄漏。
当我跑步时:
cppcheck main.cpp
我提出了以下内容:
C:\Program Files (x86)\Cppcheck>cppcheck main.cpp
Checking main.cpp...
[main.cpp:12]: (error) Memory leak: p
我检查了change log for 1.69,有趣的是它说:
改进:
- 改进了缓冲区溢出和内存泄漏检查
如果我使用new
:
char* p = new char;
func(p);
如果我在func
中释放内存,则没有错误:
void func(char *xx)
{
delete p;
}
int main(void)
{
char* p = new char;
func(p);
return 0;
}
如果我使用malloc
进行分配并尝试在delete
中使用func
取消分配,则Cppcheck也会通知我mismatchAllocDealloc
错误。