「この std::shared_ptr」の謎
スマート ポインターの領域では、プログラマーはしばしば複雑な問題に取り組んでいることに気づきます。オブジェクトの所有権と存続期間管理のウェブ。このような課題の 1 つは、現在のオブジェクトの std::shared_ptr をその子に渡そうとするときに発生します。
次のシナリオを考えてみましょう。クラス A のオブジェクトはクラス B の子のリストを保持しますが、各子は親への参照を維持します。この一見単純なタスクでは、親オブジェクトを指す std::shared_ptr を作成しようとすると障害が発生します。
<code class="cpp">class A { private: std::list<std::shared_ptr<B>> children; }; class B { public: void setParent(std::shared_ptr<A> parent) { ... } };</code>
現在の A オブジェクトの std::shared_ptr をその子に渡すにはどうすればよいでしょうか?
答え: std::enable_shared_from_this
解決策は std::enable_shared_from_this テンプレート クラス内にあります。それを継承することにより、オブジェクトは、shared_from_this メソッドを通じてそれ自体にshared_ptr を作成する機能を獲得します。
ジレンマを解決するために、A クラスをそれに応じて変更します。
<code class="cpp">class A : public std::enable_shared_from_this<A> { // ... void addChild(std::shared_ptr<B> child) { children.push_back(child); child->setParent(shared_from_this()); } };</code>
次に、親オブジェクトのshared_ptrをその子に簡単に渡すことができます。
警告: 循環依存関係とリソースリーク
ただし、このソリューションでは循環という潜在的な問題が発生します。依存関係。親と子の両方への参照を保持することで、各オブジェクトが他のオブジェクトの存在に依存するサイクルを作成します。オブジェクトが適切に解放されないと、リソース リークが発生する可能性があります。
この問題を軽減するために、子の親への参照に std::weak_ptr を採用します。弱いポインタは、参照されたオブジェクトの削除を妨げず、削除時に自動的に無効化されます。
<code class="cpp">class A { private: std::list<std::weak_ptr<B>> children; };</code>
この調整により、循環依存関係が解消され、適切なオブジェクトの破壊が保証され、メモリ リークが防止されます。
制限: 所有権とタイミング
shared_from_this() を呼び出すには、呼び出し時に現在のオブジェクトが std::shared_ptr によって所有されている必要があることに注意することが重要です。これは、オブジェクトをスタック上に作成したり、コンストラクターやデストラクター内で呼び出したりできないことを意味します。
以上が所有権に `std::shared_ptr` を使用する場合、現在のオブジェクト (this) の `std::shared_ptr` を作成して子オブジェクトに渡すにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。