关于智能指针的一个有趣的笔记

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

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/105262274
今日推荐