2017-01-19 6 views
4

C++ 11では、オブジェクトを複数のstd::shared_ptrで管理することは可能ですか? std::shared_ptrでオブジェクトを削除し、もう1つshared_ptrを無効にする(空またはnullに設定する)ことは可能ですか?そうでない場合は、オブジェクトがもはや有効ではないことを他のすべての「参照」(単語の自由使用で)に知らせる最良の方法は何ですか?特定の管理対象オブジェクトに対してすべての共有ptrを無効にする

+0

を有効期限が切れているあなたは、常に 'shared_ptr'削除を行いますどの一つの特定の知っていますか?それとも、それは任意のものにすることができますか? – Angew

+1

はい、私は 'shared_ptr'が削除を行うことを知っています。 – shane

+0

間接参照のレベルを追加します。実際のオブジェクトを保持するラッパーオブジェクトを持ち、ラッパーへのポインタを共有します。時間が来ると、実際のオブジェクトを落とすようにラッパーに指示します。その時点でアクセサのエラーが報告されます(例えば 'RealObject * getReal()'から 'nullptr'を返します) –

答えて

4

これを行うには、他のshared_ptrweak_ptrに置き換える必要があります。削除を行うshared_ptrは、実際にこのシナリオでオブジェクトの有効期間を管理するものです。この時点でが本当にに共有所有権セマンティクスを必要としているかどうかを判断することは価値があります。一般に、インタフェースがあなたに許さないものをしようとしていると感じたら、それは別のセマンティクスで何かが必要なことを示しています。

また、オブジェクトの有効期間を実際に1か所で管理できない場合は、shared_ptr<unique_ptr<T>>を使用できますが、これはもっと厄介です(遅くする必要はありません)。ここでは、オブジェクトをreset内のunique_ptrで削除します。

1

Hereweak_ptrの良い例であり、他のすべての「参照」が有効でなくなったときに通知する必要があります。

#include <iostream> 
#include <memory> 

std::weak_ptr<int> gw; 

void f() 
{ 
    std::cout << "use_count == " << gw.use_count() << ": "; 
    if (auto spt = gw.lock()) 
    { // Has to be copied into a shared_ptr before usage 
     std::cout << *spt << "\n"; 
    } 
    else 
    { 
     std::cout << "gw is expired\n"; 
    } 
} 

int main() 
{ 
    { 
     std::shared_ptr<int> sp = std::make_shared<int>(42); 
     gw = sp; 
     f(); 
    } 
    f(); 
} 

出力:
はuse_count == 1:42
はuse_count == 0:GWは

関連する問題