Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 重要なWeak Pointer関数 | スマートポインタの導入
C++スマートポインタ

book重要なWeak Pointer関数

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

expired() 関数

lock() を呼び出す前に、expired() メソッドを使用して、ウィークポインタがまだ有効かどうかを確認可能。この関数は、オブジェクトが破棄されていれば true を、そうでなければ false を返す。

expired_function.h

expired_function.h

copy
1234567891011
// Call `expired()` before `lock()` if (!p_weak.expired()) { // Lock only if the object is still alive auto p_shared = p_weak.lock(); p_shared->update(); } else { std::cout << "Object no longer exists" << std::endl; }

ウィークポインタをロックする前に expired() を呼び出すことで、参照されているオブジェクトがまだ存在しているかどうかを判断できる。

use_count() 関数

weak ポインタはオブジェクトの参照カウントに影響を与えませんが、同じオブジェクトを管理している std::shared_ptr インスタンスの数を知ることは有用です。use_count() 関数はこの数値を返します。

use_count_function.h

use_count_function.h

copy
12345
std::shared_ptr<int> p_shared = std::make_shared<int>(42); std::weak_ptr<int> p_weak(sharedPtr); // Should output one std::cout << p_weak.use_count() << std::endl;

reset() 関数

オブジェクトの監視を weak ポインタから解除するには、reset() 関数を使用します。これにより weak ポインタは空になり、どのオブジェクトも指さなくなります。

reset_function.h

reset_function.h

copy
1234
std::weak_ptr<int> p_weak(sharedPtr); // After this, `p_weak` no longer observes the `p_shared` object p_weak.reset();

swap() 関数

swap() 関数は、2つの weak ポインタの内容を交換するために使用されます。これは、動的オブジェクトの所有権やライフタイムを変更せずに、2つの weak ポインタが監視するオブジェクトを切り替えたい場合に特に有用です。

swap_function.h

swap_function.h

copy
12345678
std::shared_ptr<int> p_shared_A = std::make_shared<int>(10); std::shared_ptr<int> p_shared_B = std::make_shared<int>(20); std::weak_ptr<int> p_weak_A(p_shared_A); std::weak_ptr<int> p_weak_B(p_shared_B); // Swaps the objects `p_weak_A` and `p_weak_B` p_weak_A.swap(weakPtrB);

最初、p_weak_Ap_shared_A によって管理されているオブジェクトを監視し、p_weak_Bp_shared_B によって管理されているオブジェクトを監視します。

swap() を呼び出した後、p_weak_Ap_shared_B によって管理されているオブジェクトを監視し始め、p_weak_Bp_shared_A によって管理されているオブジェクトを監視します。

question mark

弱ポインタが指しているリソースがまだ存在するかどうかを確認したい場合、どの関数を使用すべきですか?

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

すべて明確でしたか?

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

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

セクション 1.  13

AIに質問する

expand

AIに質問する

ChatGPT

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

セクション 1.  13
some-alt