CppCheck 未检测到内存泄漏

Posted

技术标签:

【中文标题】CppCheck 未检测到内存泄漏【英文标题】:CppCheck does not detect memory leak 【发布时间】:2015-07-14 07:30:51 【问题描述】:

有以下代码,但 CppCheck(1.68) 只检测到“样式”错误。

AbstractTelegram *TelegramFactory::CreateGetWigWagParameterTelegram(BYTE     Address_i, BYTE SubAddress_i, BYTE Tag_i)

   SignDataWigWag *pWigWag = new SignDataWigWag();

   return new SendTelegram(SubAddress_i, Tag_i, Telegram::GET_WIG_WAG,NULL,0);

输出:

Variable 'pWigWag' is assigned a value that is never used.
Variable 'pWigWag' is assigned a value that is never used.

任何调整选项?

【问题讨论】:

【参考方案1】:

我是一名 Cppcheck 开发人员。

其实..我们看不出那段代码肯定有内存泄漏。

有些类具有自动内存管理功能。

例如,想象一下 SignDataWigWag 构造函数有这样的代码:

SignDataWigWag::SignDataWigWag() 
    instances.push_back(this);

然后可以稍后使用例如删除它:

void deleteAllInstances() 
    while (!instances.empty()) 
        delete instances.back();
        instances.pop_back();
    

这并不罕见。一些流行的类库有很多具有某种内存管理的类,因此不需要手动删除..

【讨论】:

曾经有一个选项可以调整这个。但据我所知,您目前无法对此进行调整。也许有一天会有更好的调整选项。【参考方案2】:

cppcheck 本质上只是一个样式检查器(和其他包含开发人员“良好样式”概念的工具一样,它的实用性取决于各种因素)。

有合适的检测内存泄漏的工具(如valgrind); cppcheck 不是其中之一。当然,您会发现对于哪些是最好的工具,甚至对于工具适合什么,例如博客条目*Valgrind is NOT a leak checker *

,您会发现不同的意见

【讨论】:

什么?你了解静态代码分析和运行时检查的区别吗? 你了解建设性批评和建设性批评之间的区别吗? 我知道,但是,您在回复之前阅读问题似乎有问题。 我熟悉可用的工具,而您在任何方面都没有提供任何证据。 那么,你还在比较 valgrind 和 cppcheck,对吧?

以上是关于CppCheck 未检测到内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

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

cppcheck 未检测到来自 epoll_create 的资源泄漏

c++代码检测工具

cppcheck 检测到资源泄漏 - 误报?

LeakCanary检测内存泄漏

linux中内存泄漏的检测记录内存泄漏的代码