2016-10-04 30 views
0

shared_ptrクラスは動的オブジェクトを自動的に管理することを理解します。shared_pointerへの参照の参照カウント

ここでは、const shared_ptr<int>int 2に返す関数fがあります。

mainの2つのバージョンが1か所で異なります。バージョンAは、の戻り値をにに保存し、バージョンBはを保存します。

using namespace std; 
    const std::shared_ptr<int> f() { 
     const std::shared_ptr<int> ret = std::make_shared<int>(2); 
     return ret; 
    } 

    int main() { 
     const std::shared_ptr<int> p = f();  // A 
     // const std::shared_ptr<int> &p = f(); // B 
     cout << p.use_count() << *p << endl; // prints 1 2 
     return 0; 
    } 

両方のバージョンが1 2と印刷されます。 pがを指す最後のshared_ptrであるため、use_count1であるため、バージョンAでは問題ありません。

質問:バージョンBではuse_count1と等しいのはなぜですか?最後に存在するのはどこですか?shared_ptr

+1

'std :: shared_ptr'の参照カウントは、参照ではなくインスタンスに適用されます。 –

+0

@πάνταῥεῖありがとうございました。バージョンAの場合、インスタンスは 'p'ですか?既存のインスタンスであるバージョンBでは、 'f()'の戻り値ですか?たぶん、私はオブジェクトのエイリアスだと思っていた参照を完全に理解していないかもしれません。 – sam

+3

一時的な有効期間はconst参照で拡張されます。 – Jarod42

答えて

1

C++では、&&またはconst&に直接テンポラリを割り当てた場合、リファレンスの有効期間が延長され、一時的に参照が保持されます。

これは、参照がローカル変数の場合にのみ有効です。


それとも、struct秒の集計建設を使用し、特定のコンパイラでは、特定の場合で

。しかし、それを使用しないでください。なぜなら、 "透過的な"転送コンストラクタが基本的に集合体とは異なる動作をする点の1つで、そうでなければ無害な変更がコードを破損する可能性があるからです。

関連する問題