2017-05-31 16 views
3

std::weak_ptrstd::make_sharedを使用したときにこの現象が発生し、ちょっと変わったと感じました。私はC++ 11を使用しています。std :: make_sharedでのstd :: weak_ptrの割り当て

#include <iostream> 
#include <memory> 

int main() 
{ 
    std::weak_ptr<int> weak; 

    std::shared_ptr<int> shared {std::make_shared<int>(42)}; 
    weak = shared; 
    std::cout << "Meaning of life: " << *weak.lock() << std::endl; 

    weak = std::make_shared<int>(23); 
    std::cout << "Meaning of life: " << *weak.lock() << std::endl; 

    return 0; 
} 

最初std::coutプリント罰金、二つ目は私にセグメンテーションフォルトを提供します。私はstd::weak_ptrstd::shared_ptrのページをcppreferenceに見てみましたが、なぜこれが起こるのかまだ分かりません。一時的なオブジェクトを作成しなければならないのは面倒です。これはC++ 14で解決されたものなのでしょうか、私が見ていないものがありますか?

ありがとうございます!

答えて

5

weak_ptrは、同じ基本オブジェクトを指しているshared_ptrオブジェクトがまだ存在する場合にのみ、ロック後に逆参照することができます。あなたの最初の部分で

std::shared_ptr<int> shared {std::make_shared<int>(42)}; 
weak = shared; 
std::cout << "Meaning of life: " << *weak.lock() << std::endl; 

これは確かにケースです。 shared_ptrが一時オブジェクトであったように、第2の部分

weak = std::make_shared<int>(23); 
std::cout << "Meaning of life: " << *weak.lock() << std::endl; 

では、そうではありません。

あなたがここで遭遇したことはまさにweak_ptrのために作られたものです。つまり、他のshared_ptrが同じ基本オブジェクトを指している限り有効です。それはits purposeです:

のstd :: weak_ptrをがのstd :: shared_ptrの...元STDの場合で管理されているオブジェクトへの非所有(「弱い」)の参照を保持するスマートポインタです:: shared_ptrはこの時点で破棄され、一時的なstd :: shared_ptrも破棄されるまでオブジェクトの存続期間が延長されます。

2

これはあなたが一時的な共有のポインタを作成し、すぐにこの行の弱いポインタに割り当てるという事実によるものである:代入演算子が終了した後

weak = std::make_shared<int>(23); 

、一時的な共有のポインタであります破壊された場合、参照カウントは0になり(弱ポインタ​​は参照カウンタを増加させないため)、ヒープ上のリソースは削除されます。

関連する問題