關於智能指針的一個有趣的筆記

這幾天比較好奇就是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;
    }
}

這一段代碼中,我會很好奇的發現在第一次調用之後智能指針p就掛掉了,因爲weak_ptr這個指針是可以判斷出一個對象是否存活的,當然你不要以爲我在棧上頻繁的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那麼就是沒有問題的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章