ホームページ > バックエンド開発 > C++ > 「make_shared」と「shared_ptr」: One More が効率的で例外安全なのはなぜですか?

「make_shared」と「shared_ptr」: One More が効率的で例外安全なのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-14 12:19:11
オリジナル
495 人が閲覧しました

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

make_shared と標準のshared_ptr の違い

make_shared はなぜ効率的ですか?

標準のshared_ptr と比較した std::make_shared の効率を理解するには、建設プロセスを段階的に見てみましょうstep.

標準のshared_ptrコンストラクターの使用:

std::shared_ptr<Object> p2(new Object("foo"));
ログイン後にコピー
  • Object("foo")のヒープ割り当てが実行されます。
  • 新しい std::shared_ptr 制御ブロックは、生のファイルを使用して作成されます。 pointer.

std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
ログイン後にコピー
  • を使用すると、std::shared_ptr 制御ブロックとオブジェクト インスタンスの両方に単一のヒープ割り当てが行われます。実行されました。

例外安全性

標準のshared_ptrコンストラクターアプローチでは、オブジェクトの構築中に例外がスローされた場合、クリーンアップは実行されず、未解決のメモリが残ります。ただし、std::make_shared は、構築されたオブジェクトと制御ブロックが単一の割り当ての一部であり、例外がスローされた場合にクリーンアップされることを保証します。

std::make_shared の欠点

  • 標準のshared_ptrコンストラクターを使用する場合と比較してメモリ保持の増加: std::make_sharedは単一の割り当てを実行するため、ポイントされたメモリは、制御ブロックが使用されなくなるまで解放できません。オブジェクトへの弱いポインタは制御ブロックを生きたままにし、メモリ保持期間の延長につながる可能性があります。

以上が「make_shared」と「shared_ptr」: One More が効率的で例外安全なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート