ポインターの無効な削除
new を使用して対応する割り当てを行っていないポインターに対して delete を使用して割り当てを解除する
説明
この欠陥は、以下の場合に発生します。
delete演算子を使用してメモリのブロックを解放したが、そのメモリが以前にnew演算子を用いて割り当てられていなかった。単一オブジェクト表記で
delete演算子を使用してメモリのブロックを解放したが、そのメモリが以前にnew演算子を用いて配列として割り当てられていた。
この欠陥は C++ ソース ファイルに対してのみ適用されます。
リスク
リスクは問題の原因によって異なります。
delete演算子はヒープに割り当てられたメモリのブロックを解放します。以前に割り当てていないヒープ上の位置にアクセスしようとすると、セグメンテーション違反が発生する可能性があります。newの配列表記で以前に割り当てたポインターに対して、delete演算子の単一オブジェクト表記を使用すると、動作が未定義になります。
この問題により、他のコーディング エラーが明らかになる場合があります。たとえば、delete 演算子または前の new 演算子を別のポインターに対して使用する必要があった可能性があります。
修正方法
修正方法は問題の原因によって異なります。
ほとんどの場合、
deleteステートメントを削除することによって問題を修正できます。new演算子を使用してポインターにヒープのメモリが割り当てられていない場合、deleteを使用してこのポインターを解放する必要はありません。単に必要に応じてポインターを再利用するか、スコープの終了時にオブジェクトが破棄されるままにしておくことができます。newとdeleteの表記が一致していない場合、その不一致を修正します。たとえば、単一のオブジェクトを割り当てて、その割り当てを解除する場合は、次の表記を使用します。classType* ptr = new classType; delete ptr;
配列オブジェクトを割り当てて、その割り当てを解除する場合は、次の表記を使用します。
classType* p2 = new classType[10]; delete[] p2;
この問題によって、間違ったポインターに対して delete または new を使用するなどのコーディング エラーが明らかになった場合は、そのエラーを修正します。
例
結果情報
| グループ: 動的メモリ |
| 言語: C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: BAD_DELETE |
| 影響度: High |
バージョン履歴
R2013b で導入