AUTOSAR C++14 Rule A20-8-2
A std::unique_ptr shall be used to represent exclusive ownership
説明
ルール定義
A std::unique_ptr shall be used to represent exclusive ownership.
根拠
ヒープ メモリへの生のポインターでは 2 つの関連する問題が発生します。
生のポインターがスコープから外れると、ポインターが指していたメモリの割り当てが解除されず、メモリ リークを発生させる可能性があります。ポインターがスコープを外れる前にメモリを明示的に割り当て解除 (ポインターを
delete) することを覚えておかなければなりません。関数に生のポインターを渡すと、ポインターが指すリソースに対してその関数が排他的所有権を持ちメモリを割り当て解除可能であるのか、それとも呼び出し元に割り当て解除をまかせなければならないのかが不明確です。関数がメモリを割り当て解除すると、同じメモリ ロケーションを指す別のポインターが使われないポインターとして残される危険があります。
std::unique_ptr オブジェクトは、両方の問題を解決し、生のポインターに対するオーバーヘッドが大きく増えないスマート ポインターです。
ポインターが指すメモリを明示的に割り当て解除する必要はありません。メモリは、ポインターがスコープを外れる前に割り当て解除されます。
ポインターは指しているオブジェクトの排他的所有権を持ちます。ポインターを移動演算で関数に渡すと、その関数はポインターを通じてメモリの所有権があるものと見なし、完了時にメモリを暗黙的に割り当て解除します (他の関数に所有権を渡していない場合)。
Polyspace 実装
チェッカーは、パラメーターまたは戻り値として生のポインターを使用する main 以外の関数にフラグを設定します。
チェッカーはこのルールと AUTOSAR C++14 Rule A20-8-3 の両方の違反を報告します。
ポインターが指すオブジェクトに対して関数が排他的所有権を持つ場合は、生のポインターを
std::unique_ptr型に変換してください。ポインターが指すオブジェクトに対して関数が共有所有権を持つ場合は、生のポインターを
std::shared_ptr型に変換してください。
トラブルシューティング
ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: General utilities library |
| カテゴリ: Required、Automated |
バージョン履歴
R2020b で導入