より効率的な make_shared の代わりに、new または make_unique が使用されています
説明
この欠陥は、以下の場合に発生します。
newまたはmake_uniqueを使用してshared_ptrインスタンスを初期化する。以下に例を示します。std::shared_ptr<T> p1(new T()); std::shared_ptr<T> p2(make_unique<T>());
newを使用してshared_ptrインスタンスをリセットする。以下に例を示します。std::shared_ptr<T> p1; //... p1.reset(new T);
複数のスマート ポインターで同じオブジェクトを所有し、管理する場合は shared_ptr インスタンスを使用します。これらのインスタンスは、管理対象のオブジェクトを所有するインスタンス数のカウントを保持する制御ブロックも共有します。
Polyspace® は、プライベートまたは保護されたコンストラクターでの new を使用した shared_ptr インスタンスの初期化にフラグを設定しません。たとえば、以下のコード スニペットでは new の使用に対して欠陥は報告されません。
class PrivateCTor
{
public:
static std::shared_ptr<PrivateCTor> makeOne()
{
return std::shared_ptr<PrivateCTor>(new PrivateCTor);
}
private:
PrivateCTor();
};リスク
new または make_unique を使用して shared_ptr インスタンスを初期化すると、追加の割り当て操作により、制御ブロックのストレージが作成されます。管理対象のオブジェクトのアドレスと比べて、追加割り当てのアドレスは異なるメモリ ページまたはデータ キャッシュの外部にあります。
修正方法
shared_ptr インスタンスを初期化するには、std::make_shared を使用します。この関数は単一の割り当て操作で、管理対象のオブジェクトと制御ブロックを格納するのに十分なメモリを割り当てます。
パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。
例
結果情報
| グループ: パフォーマンス |
| 言語: C++ |
| 既定値: オフ |
コマンド ライン構文: MISSING_MAKE_SHARED |
| 影響度: Low |
バージョン履歴
R2021a で導入