CL.MLK

析构函数中的内存泄漏

这是一个类级别 (CL) 检查器,可告知类中可能发生的内存泄漏情况。类级别检查器会根据 Scott Meyer 的高效 C++ 规则类构造来生成建议。

CL.MLK 基于 Scott Meyer 的第 6 项:针对析构函数中的指针成员使用 delete。如果构造函数中执行动态内存分配的类未在析构函数中释放该内存,并可能导致内存泄漏,这时 Klocwork 将报告 CL.MLK。

漏洞与风险

内存泄漏导致应用程序消耗更多内存。这会减少其他应用程序可用的内存量,最终导致操作系统开始分页,系统速度变慢。在严重情况下,应用程序将达到总内存限制,这可能导致应用程序崩溃。

漏洞代码示例

复制
    class C{
      char *data;
    public
      C(){ data = new char[10]; }
//...
    };

在此示例中,类 C 在构造函数中分配内存,但它没有析构函数。CL.MLK 已找到一个类,该类在构造函数中执行动态内存分配,但未在析构函数中释放该内存,这可能导致内存泄漏。即使有除释放已分配内存的析构函数以外的方法,仍可能使用该类,从而导致内存泄漏。

甚至连简单地声明某个未使用的对象也会导致内存泄漏:

复制
    void foo(){
      C c;
    }

修正代码示例

复制
    class C{
//...
      ~C() { delete[] data;}
//...
    };

在该修正代码中,析构函数释放已分配内存。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。