将堆指针传递给函数时,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 无法检测到泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何理由不会将堆指针分配给数组?

如何通过 Cppcheck 解释 Null 指针取消引用?

无法将指向派生类函数的指针传递给基类

如何检测仅使用 cppcheck 从未使用的函数中调用的函数?

由于包含路径,cppcheck 未检测到资源泄漏

将智能指针传递给函数