タイトル通り。この質問にはおそらくすでに答えがありますが、私は答えを見つけることができませんでした。
2 に答える
ネイキッド ポインターと の基本的な概念上の違いは、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
生のポインターは (少なくとも通常は) 単なるアドレスです。ポインター自体からは、それが何を指しているのかについては何もわかりません。
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_ptrとshared_ptr参照カウントがインクリメントされ、変換されたポインタがオブジェクトへの「実際の」参照であることを示します。一方、参照カウントがすでにゼロの場合 (つまり、指示先オブジェクトが既に破棄されている場合)、 を に変換しようとしてもweak_ptr失敗shared_ptrします。
Ashared_ptrは、指示先オブジェクトの共有所有権を意味します。指示先オブジェクトは、そのオブジェクトへの shared_ptr が少なくとも 1 つ存在する限り存在し続けますが、オブジェクトの最後のものが破棄されるとすぐにshared_ptr、指示先オブジェクトも破棄されます。
Aweak_ptrは、指示先オブジェクトへの非所有アクセスを意味します。オブジェクトが存在する場合、アクセスを許可します。オブジェクトが破棄されている場合は、破棄されたオブジェクトにアクセスしようとするのではなく、pointee オブジェクトが存在しないことを通知します。