ホームページ > バックエンド開発 > C++ > 所有権に `std::shared_ptr` を使用する場合、現在のオブジェクト (this) の `std::shared_ptr` を作成して子オブジェクトに渡すにはどうすればよいでしょうか?

所有権に `std::shared_ptr` を使用する場合、現在のオブジェクト (this) の `std::shared_ptr` を作成して子オブジェクトに渡すにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-10-29 02:53:02
オリジナル
512 人が閲覧しました

How can you create a `std::shared_ptr` of the current object (this) to pass to child objects when using `std::shared_ptr` for ownership?

「この 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 サイトの他の関連記事を参照してください。

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