这几天比较好奇就是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那么就是没有问题的