2017-06-09 2 views
0

私は同様のquestionを見つけましたが、私の例は若干異なります。ここでshared_ptrのリセット後、weak_ptrは常に期限切れになりますか?

は非常に単純な例です:

int main() 
{ 
    auto sp = std::make_shared<T>(); 
    std::weak_ptr<T> wp = sp; 
    sp.reset(); 
    assert(wp.expired()); 
} 

それはshared_ptrのリセット後に上記の場合には、常に有効期限が切れているのweak_ptrことが保証されていますか?

+1

@ tobi303この質問は、同じオブジェクトで 'shared_ptr'をリセットするとどうなるでしょうか?この質問は、オブジェクトなしでリセットするとどうなるかを尋ねます。 – GuyRT

+0

@GuyRTああ、もちろん違いです。それを見落とした...クローズ投票を引っ込めた – user463035818

答えて

4

はい、これは保証されています。

sp.reset(); 

を呼び出すと、spが戻っデフォルト構築状態になったことを意味

shared_ptr().swap(*this) 

のと同じです。 *thisときshared_ptrオブジェクト、*thisが含まの数、*this、または0とその共有の所有権:私たちは、標準でuse_countを見れば、私たちは

戻り値を持っています。

そして、それが空であることから、use_count0expriedでは、管理対象オブジェクトがすでに削除されているかどうかをexpried

チェックしてtrueになります。 use_count() == 0に相当します。

3

はい、expired()use_count()==0に相当します。 use_count()は、管理オブジェクトを共有するshared_ptrインスタンスの数を返すものとして定義されています。 sp.reset()に電話すると、その番号はゼロです。

関連する問題