次のコード スニペットを考えてみましょう。
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));
理由を理解するmake_shared は、shared_ptr コンストラクターを直接使用するより効率的です。関連する操作の段階的な分析。
make_shared はメモリを 1 回だけ割り当てますが、コンストラクタで初期化されたshared_ptr はメモリを 2 回割り当てます。これにより、make_shared がより効率的になります。
C 17 では、関数の引数の評価順序が改訂され、コンストラクターで初期化されるshared_ptr アプローチによる例外の安全性の問題が排除されました。ただし、次の例を考えてみましょう。
void F(const std::shared_ptr<Lhs> &lhs, const std::shared_ptr<Rhs> &rhs) { /* ... */ } F(std::shared_ptr<Lhs>(new Lhs("foo")), std::shared_ptr<Rhs>(new Rhs("bar")));
Rhs コンストラクター中に例外がスローされた場合、Lhs に割り当てられたメモリは、shared_ptr コンストラクターにすぐに渡されなかったため、失われます。 make_shared は、この中間ステップを排除することでこの問題を回避します。
ただし、make_shared には欠点があります。制御ブロックと管理オブジェクトを単一のヒープ ブロックに割り当てるため、両方を独立して割り当て解除することはできません。これは、弱いポインタが制御ブロックを無期限に存続させ、制御ブロックと管理対象オブジェクトの両方の割り当てが解除されなくなる可能性があることを意味します。
以上が`make_shared` とコンストラクターで初期化された `shared_ptr`: パフォーマンスと例外の安全性の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。