AUTOSAR C++14 Rule A18-5-2
Non-placement new or delete expressions shall not be used
説明
ルール定義
Non-placement new or delete expressions shall not be used.
根拠
非配置の new または delete 演算子を明示的に使用すると、予期しない例外や戻り値によってメモリ リークが発生する可能性があります。new を明示的に呼び出してポインター用のメモリを割り当ててから、delete を明示的に呼び出してメモリの割り当てを解除する次のコードを考えてみましょう。
std::int32_t ThrowError(){
std::int32_t errorCode;
std::int31_t* ptr = new std::int32_t{0};
//...
if(errorCode!=0){
throw std::runtime_error{"Error"};
}
//...
if (errorCode != -1) {
return 1;
}
delete ptr;
return errorCode;
}1 つ目の
if()ステートメントがtrueの場合は、関数が例外を生成し、ポインターを削除せずに終了します。2 つ目の
if()ステートメントがtrueの場合は、関数が1を返し、ポインターを削除せずに終了します。
予測不能なメモリ リークを回避するには、非配置の new および delete 演算子を使用しないでください。代わりに、オブジェクトで動的に割り当てられたリソースをカプセル化してください。オブジェクト コンストラクターでリソースを取得し、オブジェクト デストラクターでリソースを解放します。この設計パターンは、"Resource Acquisition Is Initialization" (RAII) と呼ばれています。RAII パターンに従うことによって、予期せぬ例外や戻り値が発生した場合でも、メモリ リークが回避されます。
または、動的に割り当てられたリソースのライフタイムを管理するマネージャー オブジェクトを使用します。標準ライブラリのマネージャー オブジェクトの例を以下に示します。
std::unique_ptrとstd::make_uniquestd::shared_ptrとstd::make_sharedstd::stringstd::vector
このルールは、ユーザー定義の RAII クラスおよびマネージャー内の new 演算子または delete 演算子には適用されません。
Polyspace 実装
AUTOSAR C++14 では、割り当てられたリソースがすぐに以下に渡される 2 つのケースで new 演算子を呼び出すことによる明示的なリソース割り当てが許可されます。
マネージャー オブジェクト
new演算子の安全な代替手段がない RAII クラス
Polyspace® は、new 演算子と delete 演算子のすべての明示的な使用にフラグを設定します。new 演算子を容認可能なプロセスがあり、安全な代替手段がない場合は、結果またはコード内でコメントを使用して問題を正当化します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)。
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 言語サポート ライブラリ |
| カテゴリ: Required、Partially automated |
バージョン履歴
R2020a で導入