38

タイトル通り。この質問にはおそらくすでに答えがありますが、私は答えを見つけることができませんでした。

4

2 に答える 2

30

ネイキッド ポインターと の基本的な概念上の違いは、weak_ptr指しているオブジェクトが破棄された場合、ネイキッド ポインターはそれについて通知しないことです。これは、ダングリング ポインター (存在しないオブジェクトへのポインター) と呼ばれます。それらを追跡するのは一般的に困難です。

weak_ptr意志。を使用するにはweak_ptr、まず に変換する必要がありますshared_ptr。それshared_ptrが何も指していない場合、オブジェクトは削除されています。

例えば:

#include <iostream>
#include <memory>

std::weak_ptr<int> wp;

void test()
{
    auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage
    if (spt) {
        std::cout << *spt << "\n";
    } else {
        std::cout << "wp is expired\n";
    }
}

int main()
{
    {
        auto sp = std::make_shared<int>(42);
        wp = sp;
        test();
    }
    test();
}

出力

42
wp is expired
于 2013-05-26T15:44:10.680 に答える
22

生のポインターは (少なくとも通常は) 単なるアドレスです。ポインター自体からは、それが何を指しいるのかについては何もわかりません。

Aweak_ptrは常に a に関連付けられているため、 a の意味を理解するにはshared_ptr、おそらく a から始める必要があります。shared_ptrweak_ptr

Ashared_ptrは参照カウントされるため、オブジェクトへの参照 (ポインター) がいくつ存在するかを追跡し、そのオブジェクトへの参照が存在しなくなると、オブジェクトを自動的に破棄します。

すでに述べたように、 aweak_ptrは a に関連付けられていshared_ptrます。a とは異なり、 ashared_ptrが存在しても、指示先オブジェクトの参照カウントは増加weak_ptrしません。を使用するweak_ptrには、まず に変換する必要がありますshared_ptr。現在の参照カウントが正の場合、それは成功し、を に変換するweak_ptrshared_ptr参照カウントがインクリメントされ、変換されたポインタがオブジェクトへの「実際の」参照であることを示します。一方、参照カウントがすでにゼロの場合 (つまり、指示先オブジェクトが既に破棄されている場合)、 を に変換しようとしてもweak_ptr失敗shared_ptrします。

Ashared_ptrは、指示先オブジェクトの共有所有権を意味します。指示先オブジェクトは、そのオブジェクトへの shared_ptr が少なくとも 1 つ存在する限り存在し続けますが、オブジェクトの最後のもの破棄されるとすぐにshared_ptr、指示先オブジェクトも破棄されます。

Aweak_ptrは、指示先オブジェクトへの非所有アクセスを意味します。オブジェクトが存在する場合、アクセスを許可します。オブジェクトが破棄されている場合は、破棄されたオブジェクトにアクセスしようとするのではなく、pointee オブジェクトが存在しないことを通知します。

于 2013-05-26T15:34:09.593 に答える