将堆指针传递给函数时,cppcheck 无法检测到泄漏?
Posted
技术标签:
【中文标题】将堆指针传递给函数时,cppcheck 无法检测到泄漏?【英文标题】:cppcheck can't detect leaks when heap pointers are passed to functions? 【发布时间】:2015-03-06 18:18:19 【问题描述】:为什么cppcheck
无法在像本例这样的程序中检测到内存泄漏,其中堆指针的所有权被传递给未能释放它的函数?
#include <stdlib.h>
void func(char *xx)
// do nothing
int main(void)
char *p = malloc(1000);
func(p);
return 0;
如果我删除对func(p)
的调用,那么 cppcheck 会检测到泄漏。
【问题讨论】:
这里有什么问题? 我已经改写了这个问题,以澄清我认为你在问什么。我还纠正了您代码中的一些小错误,这些错误可能会分散人们对问题的关注。如果我误解了,请告诉我。 所有权不一定传递给func,func可以访问内存。目的是 main() 将释放指针。 cppcheck 似乎假设所有权已被传递,但它并未验证内存是否已实际释放。 【参考方案1】:我正在使用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
,Cppcheck 也会正确通知我内存泄漏:
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
分配并尝试在func
中使用delete
解除分配,Cppcheck 还会通知我mismatchAllocDealloc
错误。
【讨论】:
以上是关于将堆指针传递给函数时,cppcheck 无法检测到泄漏?的主要内容,如果未能解决你的问题,请参考以下文章