2016-05-23 18 views
3

私は以下のようなshared_ptrsのベクトルを持っています。std :: vectorのshared_ptr要素の置き換え

std::vector<std::shared_ptr<SharedThing>> things; 

今の私は、ベクター上にshared_ptrsの数をプッシュするとしましょう、私は私が望む新しいのshared_ptrとそれらの要素の一つを交換する必要がある場合には、各要素は現在、1

の参照カウントを持っています古いshared_ptrがスコープから外れる。通常の要素割り当てはこれを達成するか、shared_ptrの内容をコピーするだけですか?例:

things.at(0) = new_shared_ptr; 

これはthings.at(0)の参照カウントを減らし、new_shared_ptrのカウントを増やすのでしょうか?

+0

はい、これを証明するためにデバッガを使用します。 –

+2

http://en.cppreference.com/w/cpp/memory/shared_ptr/operator%3D – GManNickG

答えて

2

はい、基本的には正しいです。
より正確にするために、以前のshared_ptr(0)の参照カウントはデクリメントされます。そして、あなたはそれに新しいshared_ptrを割り当てます。これは、カウント1を持つかもしれません。(0)の参照カウントが同じであるように見えますが、変更されて元に戻りました。

あなたがSTDでそれを確認することができます:: shared_ptrの:: use_cout()詳細については

を、 things.at(0) = new_shared_ptr;

が含まれている場合、我々は、STLにデバッグすることができます/ C++/4.8.3 /ビット/ shared_ptr_base.h:556

__shared_count& 
    operator=(const __shared_count& __r) noexcept 
    {  
_Sp_counted_base<_Lp>* __tmp = __r._M_pi; 
if (__tmp != _M_pi) 
    {  
    if (__tmp != 0) 
     __tmp->_M_add_ref_copy(); 
    if (_M_pi != 0) 
     _M_pi->_M_release(); 
    _M_pi = __tmp; 
    }  
return *this; 
    }  

_M_use_減少する新しい_M_add_ref_copy()、次いで前の_M_release()、

3

これらの要素のうちの1つを新しいshared_ptrに置き換える必要がある場合、私はで、古いshared_ptrをスコープから外したいと考えています。通常の要素 割り当てがこれを達成しますか?

ベクトル内の共有ポインタがスコープの外に行くことはありません、
は、それが与えられた新しいものを使用して管理オブジェクトを置換します。

呼び出し:

things.at(0) = new_shared_ptr; 

は1

でカウントが保持されますここでは、この動作を確認する簡単な方法です:

#include <iostream> 
#include <vector> 
#include <memory> 

int main(){ 

    //vector with a shared pointer 
    std::vector<std::shared_ptr<int>> things; 
    things.push_back(std::make_shared<int>(1)); 

    //prints 1 
    std::cout << things.at(0).use_count() << '\n'; 

    //assign a new value 
    things.at(0) = std::make_shared<int>(2); 

    //still prints 1 
    std::cout << things.at(0).use_count() << '\n'; 
} 

あなたの質問の一部ではないが、それはnewの代わりにmake_sharedを使用することをお勧めします。

+1

これは「カウントを保存している」わけではありません。あなたはまったく別のオブジェクトからカウントを読み取っています。 (使用カウントは 'shared_ptr'の一部ではなく、ターゲットオブジェクトのメタデータブロックの一部です) –

関連する問題