CL.MLK

デストラクタのメモリ リーク

これはクラスでのメモリリークの可能性を通知するクラスレベル (CL) のチェッカーです。クラスレベルのチェッカーは有効な C++ のための Scott Meyer 規則クラス構築に基づいて推奨を通知します。

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 knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。