警告 C6278
'variable' は配列 new [] で割り当てられますが、スカラー削除で削除されます。 デストラクターは呼び出されません。
解説
この警告は、C++ のコードだけで発生します。呼び出し関数が配列 new []
演算子によって一貫性のないメモリ割り当てを行い、スカラー型の delete
演算子によって解放したことを示します。 この使用法は、C++ 標準と Microsoft C++ の実装に従って未定義の動作です。
この不一致によって問題が発生する可能性が高い理由は少なくとも 3 つあります。
配列内の個々のオブジェクトのコンストラクターが呼び出されますが、デストラクターは呼び出されません。
グローバルまたはクラス固有で、互換性がない
operator new[]
場合やoperator delete[]
、operator new
operator delete
予期しない結果が発生する可能性があります。未定義の動作に依存するのは常に危険です。
この問題による影響を正確に予測することは困難です。 メモリの割り当て解除を実行するデストラクターを持つクラスのリークが発生する可能性があります。 意味的に重要な操作を実行するデストラクターを持つクラスの動作に矛盾が生じる可能性があります。また、演算子がオーバーライドされるとメモリの破損やクラッシュが発生する可能性があります。 コンパイラとそのライブラリの実装状態によっては、不一致が問題とならない場合もあります。 分析ツールでは、これらの状況を常に区別できるわけではありません。
メモリが配列で割り当てられている場合は、配列new []
delete[]
で解放する必要があります。
コード分析名: ARRAY_NEW_DELETE_MISMATCH
例
次のサンプル コードでは、警告 C6278 が生成されます。
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
この警告を解決するには、次のサンプル コードを使用します。
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
配列内の基になるオブジェクトが 、float
、、enum
、ポインターなどのint
プリミティブ型の場合、呼び出すデストラクターはありません。 このような場合は、代わりに警告 C6283 が報告されます。
メモリ リークとdelete
例外のnew
観点から、多くの落とし穴があり、使用されます。 このような潜在的なリークを完全に回避するには、C++ 標準ライブラリ (STL) によって提供されるメカニズムを使用します。 これらには、次unique_ptr
のようなvector
コンテナーが含まれますshared_ptr
。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示