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;
}
相关检查器
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。