這幾天比較好奇就是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那麼就是沒有問題的