Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Weakポインタによる循環参照の解消 | スマートポインタの導入
C++スマートポインタ

bookWeakポインタによる循環参照の解消

メニューを表示するにはスワイプしてください

weakポインタは循環参照を解消するために設計されています。循環依存関係にあるstd::shared_ptrstd::weak_ptrに置き換えることで、オブジェクト同士が互いの寿命を意図せず延長することを防ぎ、適切な破棄が可能になります。

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425
#include <iostream> #include <memory> class Node { public: Node() { std::cout << "Node constructed." << std::endl; } ~Node() { std::cout << "Node destructed." << std::endl; } // A weak pointer to the next element prevents circular ownership. std::weak_ptr<Node> next; }; int main() { // Creating three Node objects. std::shared_ptr<Node> node1 = std::make_shared<Node>(); std::shared_ptr<Node> node2 = std::make_shared<Node>(); std::shared_ptr<Node> node3 = std::make_shared<Node>(); // Creating a list where the last node's next is a weak pointer node1->next = node2; node2->next = node3; node3->next = node1; // Now when node1, node2, and node3 go out of scope, their destructors will be called }

循環参照の問題は、nextstd::shared_ptrからstd::weak_ptrに変更することで解決されます。コード内のコメントを参照して理解を深めてください。コードを実行して、デストラクタが正しく呼び出されること(メモリリークなし)を確認しましょう。

question mark

次のコードでは、2つの共有ポインタ AB が同じリソースを共有しています。B を弱参照ポインタに変更してください。

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  12

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  12
some-alt