std::weak_ptr はいつ役に立つのでしょうか? 質問する

std::weak_ptr はいつ役に立つのでしょうか? 質問する

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

おすすめ記事