タイトルのとおり。この質問にはすでに回答がありますが、見つけられませんでした。生ポインタと弱ポインタの違いは何ですか?
答えて
裸のポインタと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
生のポインタは(少なくとも通常は)単純にアドレスです。ポインター自体からを指して何かを教えてもらうことはできません。weak_ptr
は常にshared_ptr
に関連付けられているので、私たちは、おそらくweak_ptr
のいずれかの意味を理解するためにshared_ptr
で開始する必要があります。
shared_ptr
は参照カウントされるので、オブジェクトへの参照(ポインタ)がいくつ存在するかを追跡し、そのオブジェクトへの参照がなくなったときにオブジェクトを自動的に破棄します。
すでに述べたように、weak_ptr
はshared_ptr
に関連付けられています。 shared_ptr
とは異なり、weak_ptr
の存在はではありません。は、pointeeオブジェクトの参照カウントをインクリメントします。 weak_ptr
を使用するには、まずshared_ptr
に変換する必要があります。現在の参照カウントが肯定的であれば、それは成功するでしょう、をshared_ptr
に変換するとは、変換されたポインタがオブジェクトへの「実際の」参照であることを示す参照カウントをインクリメントします。一方、参照カウントが既にゼロである場合(つまり、pointeeオブジェクトが既に破壊されていることを意味する)、weak_ptr
をshared_ptr
に変換しようとすると失敗するだけです。
shared_ptr
は、pointeeオブジェクトの共有所有権を意味します。 pointeeオブジェクトは、そのオブジェクトへの少なくとも1つのshared_ptrが存在する限り、オブジェクトに最後のshared_ptr
が破棄されるとすぐにしかしが存在する限り存在し続けます。
weak_ptr
は、pointeeオブジェクトへの非所有アクセスを意味します。オブジェクトが存在する場合にアクセスを許可します。オブジェクトが破棄された場合、破棄されたオブジェクトにアクセスしようとするのではなく、pointeeオブジェクトが存在しなくなったことが伝えられます。
- 1. 強いポインタと弱いポインタとは
- 2. ctypesのLP_ *ポインタと* _pポインタの違いは何ですか?
- 3. 文字列への生ポインタとi32への生ポインタの逆参照との違いは何ですか?
- 4. Specmanのポインタとインスタンスの違いは何ですか?
- 5. Cのポインタとグローバル変数の違いは何ですか?
- 6. C++クラス・ポインタとクラス・オブジェクトの間の違いは何ですか?
- 7. リファレンスとポインタの違いは何ですか?
- 8. golang型アサーション、インタフェース{}(ポインタ)とインタフェース{}(オブジェクト)の違いは何ですか?
- 9. これらのタイプのポインタの違いは何ですか?
- 10. 異なるタイプのポインタの違いは何ですか?
- 11. ポインタの* p、** p、*** pの違いは何ですか?
- 12. 両方のポインタの違いは何ですか?
- 13. enable_shared_from_this - 空の内部弱ポインタ?
- 14. 弱い参照またはポインタ
- 15. 弱い/強い参照ポインタの関係
- 16. これにコンストラクタ内の弱いポインタ
- 17. C++でvoidポインタとは何ですか?
- 18. ポインタ/アドレスの違い
- 19. Cスタイルのポインタとidスタイルのオブジェクトの違いは何ですか?
- 20. 合成ポインタとは何ですか?
- 21. ファイル位置ポインタとは何ですか?
- 22. 'this'ポインタとは何ですか?
- 23. 迅速なポインタのキャストと強制の違いは何ですか?
- 24. C/C++で生ポインタと関数ポインタでサポートされている操作は何ですか?
- 25. ポインタへのポインタを使用するポイントは何ですか?
- 26. 共有ポインタと生のポインタ寿命
- 27. 参照変数とconstポインタ変数の違いは何ですか?
- 28. Objective-C:idと不透明なポインタIDの違いは何ですか?
- 29. 符号なしのcharポインタとcharポインタの違い
- 30. WAVL(弱いAVL)とレッドブラックツリーの違いは何ですか?
有効な何かへのweak_ptrポイントをかどうかを確認することができます。あなたは生のポインタでそれを行うことはできません。 – juanchopanza
あなたが[ここ](http://en.cppreference.com/w/cpp/memory/weak_ptr)を見て、あなた自身の違いをすべて見ている方がおそらく良いでしょう。 1つの違いはありません、多くがあります。 – juanchopanza