ホームページ  >  記事  >  バックエンド開発  >  「this」の「std::shared_ptr」を関連オブジェクトに安全に渡すにはどうすればよいですか?

「this」の「std::shared_ptr」を関連オブジェクトに安全に渡すにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-28 21:01:30755ブラウズ

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

「この std::shared_ptr の」ジレンマを理解する

スマート ポインターの使用では、多くの場合、2 つの関連オブジェクト A と B が次のオブジェクトにアクセスする必要があるというシナリオが発生します。お互い。ただし、この接続を確立するために std::shared_ptr を渡すのは困難になります。

たとえば、子オブジェクト B を追加する必要がある親であるクラス A を考えてみましょう。親の addChild メソッドは、理想的には std:: を渡す必要があります。

ただし、this ポインタが右辺値であるため、child->setParent(this) を直接実行しようとすると失敗します。これを解決するために、C は std::enable_shared_from_this を提供します。

解決策: std::enable_shared_from_this

std::enable_shared_from_this は、std::shared_ptr を介したオブジェクトの共有を容易にするクラス テンプレートです。これを継承することで、必要な std::shared_ptr を提供するshared_from_this() にアクセスできるようになります。次の変更されたコードに見られます。

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>

さらに、メモリ リークにつながる可能性のある循環依存関係を防ぐためです。 、親の存在に依存する子には std::weak_ptr を使用することをお勧めします。

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>

予防策

.shared_from_this() は呼び出し時にのみ呼び出される必要があることに注意することが重要です。オブジェクトは std::shared_ptr によって管理されます。これは、スタック上に作成できず、通常はコンストラクターやデストラクターで呼び出すことができないことを意味します。

以上が「this」の「std::shared_ptr」を関連オブジェクトに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。