タイトルのとおり。この質問にはすでに回答がありますが、見つけられませんでした。生ポインタと弱ポインタの違いは何ですか?
答えて
裸のポインタと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. Specmanのポインタとインスタンスの違いは何ですか?
- 4. Cのポインタとグローバル変数の違いは何ですか?
- 5. リファレンスとポインタの違いは何ですか?
- 6. enable_shared_from_this - 空の内部弱ポインタ?
- 7. これらのタイプのポインタの違いは何ですか?
- 8. 弱い参照またはポインタ
- 9. 弱い/強い参照ポインタの関係
- 10. これにコンストラクタ内の弱いポインタ
- 11. ポインタ/アドレスの違い
- 12. C++でvoidポインタとは何ですか?
- 13. Cスタイルのポインタとidスタイルのオブジェクトの違いは何ですか?
- 14. 合成ポインタとは何ですか?
- 15. 'this'ポインタとは何ですか?
- 16. 迅速なポインタのキャストと強制の違いは何ですか?
- 17. C/C++で生ポインタと関数ポインタでサポートされている操作は何ですか?
- 18. 符号なしのcharポインタとcharポインタの違い
- 19. Objective-C:idと不透明なポインタIDの違いは何ですか?
- 20. 参照変数とconstポインタ変数の違いは何ですか?
- 21. 静的ポインタは強いポインタですか?
- 22. 弱い静的ポインタを使用できますか?
- 23. C++で親に弱いポインタを維持するには?
- 24. ポインタに適したポインタは何ですか?
- 25. 文字配列とポインタの違い
- 26. これらの2つのポインタ宣言の違いは何ですか?
- 27. ポインタと.netポインタ
- 28. C#代理人、動的プロキシ、クロージャ、関数ポインタの違いは何ですか?
- 29. 配列、ポインタとポインタ
- 30. ポインタがポインタにない場合のポインタへのポインタの衝突
有効な何かへのweak_ptrポイントをかどうかを確認することができます。あなたは生のポインタでそれを行うことはできません。 – juanchopanza
あなたが[ここ](http://en.cppreference.com/w/cpp/memory/weak_ptr)を見て、あなた自身の違いをすべて見ている方がおそらく良いでしょう。 1つの違いはありません、多くがあります。 – juanchopanza