为什么cppcheck
无法在像这个示例这样的程序中检测到内存泄漏,其中堆指针的所有权被传递给无法释放它的函数?
#include <stdlib.h>
void func(char *xx)
{
// do nothing
}
int main(void)
{
char *p = malloc(1000);
func(p);
return 0;
}
如果我删除调用func(p)
然后 cppcheck 确实检测到泄漏。
我正在使用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
我检查了1.69 的更改日志,有趣的是它说:
改进:
- 改进了缓冲区溢出和内存泄漏检查
如果我使用 Cppcheck 也会正确地通知我内存泄漏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;
}
如果我用 in 分配malloc
并尝试用delete
in解除分配func
,Cppcheck 也会通知我一个mismatchAllocDealloc
错误。