2013-05-26 34 views
15

タイトルのとおり。この質問にはすでに回答がありますが、見つけられませんでした。生ポインタと弱ポインタ​​の違いは何ですか?

+7

有効な何かへのweak_ptrポイントをかどうかを確認することができます。あなたは生のポインタでそれを行うことはできません。 – juanchopanza

+1

あなたが[ここ](http://en.cppreference.com/w/cpp/memory/weak_ptr)を見て、あなた自身の違いをすべて見ている方がおそらく良いでしょう。 1つの違いはありません、多くがあります。 – juanchopanza

答えて

16

裸のポインタと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 
17

生のポインタは(少なくとも通常は)単純にアドレスです。ポインター自体からを指して何かを教えてもらうことはできません。weak_ptr

は常にshared_ptrに関連付けられているので、私たちは、おそらくweak_ptrのいずれかの意味を理解するためにshared_ptrで開始する必要があります。

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

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

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

weak_ptrは、pointeeオブジェクトへの非所有アクセスを意味します。オブジェクトが存在する場合にアクセスを許可します。オブジェクトが破棄された場合、破棄されたオブジェクトにアクセスしようとするのではなく、pointeeオブジェクトが存在しなくなったことが伝えられます。

関連する問題