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

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

Oct 29, 2024 am 02:53 AM

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&lt;std::shared_ptr&lt;B&gt;&gt; children;
};

class B {
public:
    void setParent(std::shared_ptr&lt;A&gt; 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&lt;A&gt; {
    // ...
    void addChild(std::shared_ptr&lt;B&gt; child) {
        children.push_back(child);
        child-&gt;setParent(shared_from_this());
    }
};</code>
ログイン後にコピー

次に、親オブジェクトのshared_ptrをその子に簡単に渡すことができます。

警告: 循環依存関係とリソースリーク

ただし、このソリューションでは循環という潜在的な問題が発生します。依存関係。親と子の両方への参照を保持することで、各オブジェクトが他のオブジェクトの存在に依存するサイクルを作成します。オブジェクトが適切に解放されないと、リソース リークが発生する可能性があります。

この問題を軽減するために、子の親への参照に std::weak_ptr を採用します。弱いポインタは、参照されたオブジェクトの削除を妨げず、削除時に自動的に無効化されます。

<code class="cpp">class A {
private:
    std::list&lt;std::weak_ptr&lt;B&gt;&gt; children;
};</code>
ログイン後にコピー

この調整により、循環依存関係が解消され、適切なオブジェクトの破壊が保証され、メモリ リークが防止されます。

制限: 所有権とタイミング

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

以上が所有権に `std::shared_ptr` を使用する場合、現在のオブジェクト (this) の `std::shared_ptr` を作成して子オブジェクトに渡すにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

See all articles