AUTOSAR C++14 Rule A20-8-6
std::make_shared shall be used to construct objects owned by std::shared_ptr
説明
ルール定義
std::make_shared shall be used to construct objects owned by std::shared_ptr.
根拠
関数 std::make_shared を使用することによって、直接 std::shared_ptr オブジェクトを作成します。
auto numberPtr = std::make_shared<numberClass>(aNumber);
std::shared_ptr オブジェクトを作成することは避けます。class numberClass {
public:
numberClass(int n): number(n){}
private:
int number;
}
int aNumber=1;
std::shared_ptr<numberClass> numberPtr (new numberClass(aNumber)); 以下の理由で std::make_shared を使用することを推奨します。
std::shared_ptrオブジェクトの作成が単一の動的なメモリ割り当てで実行され、実行時パフォーマンスが向上します。そうしない場合、new演算子を使用することにより生のポインターを作成することで 1 回の動的メモリ割り当てが必要になり、生のポインターをstd::shared_ptrオブジェクトに変換することで 2 回目の割り当てが必要になります。2 回目の割り当てでは共有リソースの参照カウントを追跡するための制御ブロックが作成され、共有リソースへのすべてのポインターを認識するstd::shared_ptrオブジェクトが作成されます。std::make_sharedを使用したstd::shared_ptrオブジェクトの作成は例外セーフです。そうしない場合、new演算子を使用する動的メモリ割り当てとそれに続く変換の間で例外が発生する可能性があり、そうするとメモリ リークを招きます。例外でメモリ リークが引き起こされるのは特定のコンテキストの場合のみです。たとえば、std::shared_ptrオブジェクトが複数パラメーター関数の引数で作成され、もう一方の関数引数評価で例外がスローされる場合です。より簡潔な構文を使用できます。動的に割り当てられるオブジェクトのデータ型を繰り返す必要はありません。
Polyspace 実装
チェッカーは、new 演算子から返された生のポインターからの std::shared_ptr オブジェクト (または boost::shared_ptr オブジェクト) の作成にフラグを設定します。
トラブルシューティング
ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: General utilities library |
| カテゴリ: Required、Automated |