スマートポインタに関する興味深いメモ

過去数日間、スコープを離れた後にC ++スマートポインターが破棄されるかどうかについて、私はもっと興味があります。疑問は、自分で書いた小さなコードから来ています。

 

int count = 0;
vector<weak_ptr<Observer>> observers;
typedef std::vector<weak_ptr<Observer>>::iterator Iterator;
while (1) {
    shared_ptr<Foo> p(new Foo);
    weak_ptr<Foo> w(p);
    observers.push_back(w);
    Iterator it = observers.begin();

    while(it != observers.end())
    {
        cout<<w.lock()<<endl;
        it++;
    }
    if(count == sum)
    {
        break;
    }
}

このコードでは、weak_ptrポインターがオブジェクトが生きているかどうかを判断できるため、最初の呼び出しの後にスマートポインターpがハングすることに非常に興味があります。もちろん、スタックでmake_sharedを頻繁に行うとは思わないでください。ポインタが変わりますスタックに適用すると常にメモリアドレスになります!それから私は情報をチェックしに行き、次のコードを書きました

int main()
{
//    pthread_t thread1;
//    pthread_t thread2;
//    pthread_t thread3;
//    pthread_create(&thread1, nullptr,threadOne,nullptr);
//    pthread_create(&thread2,nullptr,threadTwo,nullptr);
//    pthread_create(&thread3,nullptr,threadThree,nullptr);
//
//    pthread_join(thread1,nullptr);
//    pthread_join(thread2,nullptr);
//    pthread_join(thread3,nullptr);
    weak_ptr<Foo> globalPtr;
    {
        auto p = make_shared<Foo>();
        weak_ptr<Foo> p2(p);
        globalPtr = p2;
        cout<<globalPtr.lock()<<endl;
    }
    cout<<globalPtr.lock()<<endl;
}

このコードは実際にはもっと興味深いものです。スコープ外になると、globalptrが破棄され、出力は次のようになります。

0x5628df8eae80
0

実際、スマートポインターがスコープ外になると、破棄プロセスがトリガーされ、カウンターが削減されます。カウンターが0の場合、weak_ptrはshared_ptrのカウンター(弱参照)を増やすことができないため、スマートポインターは自然に破棄されます。このとき、スコープ外になった後、pのカウンターは0で、この時点で破壊され、globalptrは自然に破壊されるので、0が表示されます。もちろん、globalptrをweakptrに置き換えれば問題ありません。 。

おすすめ

転載: blog.csdn.net/qq_32783703/article/details/105262274