C++11 のスマート ポインターを勉強し始めましたが、 の便利な使い方がわかりません。が便利なstd::weak_ptr
場合や必要な場合は誰か教えてもらえますか?std::weak_ptr
ベストアンサー1
std::weak_ptr
非常に良い解決方法ですぶら下がりポインタ問題。生のポインターだけを使用すると、参照されたデータが解放されたかどうかを知ることは不可能です。代わりに、 にstd::shared_ptr
データを管理させ、std::weak_ptr
そのデータをユーザーに提供することで、ユーザーはexpired()
または を呼び出してデータの有効性をチェックできますlock()
。
を単独で使用してこれを行うことはできませんstd::shared_ptr
。これはstd::shared_ptr
、 のすべてのインスタンスが削除される前に削除されないデータの所有権をすべてのインスタンスが共有しているためstd::shared_ptr
です。 を使用してダングリング ポインターを確認する例を次に示しますlock()
。
#include <iostream>
#include <memory>
int main()
{
// OLD, problem with dangling pointer
// PROBLEM: ref will point to undefined data!
int* ptr = new int(10);
int* ref = ptr;
delete ptr;
// NEW
// SOLUTION: check expired() or lock() to determine if pointer is valid
// empty definition
std::shared_ptr<int> sptr;
// takes ownership of pointer
sptr.reset(new int);
*sptr = 10;
// get pointer to data without taking ownership
std::weak_ptr<int> weak1 = sptr;
// deletes managed object, acquires new pointer
sptr.reset(new int);
*sptr = 5;
// get pointer to new data without taking ownership
std::weak_ptr<int> weak2 = sptr;
// weak1 is expired!
if(auto tmp = weak1.lock())
std::cout << "weak1 value is " << *tmp << '\n';
else
std::cout << "weak1 is expired\n";
// weak2 points to new data (5)
if(auto tmp = weak2.lock())
std::cout << "weak2 value is " << *tmp << '\n';
else
std::cout << "weak2 is expired\n";
}
出力
weak1 is expired
weak2 value is 5