タイトル通り。この質問にはおそらくすでに答えがありますが、私は答えを見つけることができませんでした。
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_ptr
weak_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 オブジェクトが存在しないことを通知します。