waithome
waithome
2019-03-03 21:14
采纳率: 100%
浏览 518

shared_ptr reset 疑问

做了个小实验,代码如下:

int main()
{
    int* p = new int(100);
    shared_ptr<int> p1(p);

    shared_ptr<int> p2 = p1;
    cout<<"p1 引用数(1):"<<p1.use_count()<<endl;               // 打印2
    p1.reset();
    cout<<"p1 引用数(2):"<<p1.use_count()<<endl;               // reset了一次之后就打印0了,为什么会是0,如果是0, p应该被释放了才对啊

    cout<<*p<<endl;         // 打印 100
    system("pause");

    return 0;
}

望有大神给我解惑

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • hack_to_hell
    hack_to_hell 2019-03-04 09:26
    已采纳

    shared_ptr p2 = p1;
    经过这句之后,p2和p1内部都指向你分配的p这块内存,p被引用的计数为2,但经过
    p1.reset();
    这一句之后,p1内部被指定到类似于一个nullptr指向的地方,它不再指向p,且整个程序中所有的shared_ptr对p这块内存的引用会减1,所以p的引用计数现在是2-1=1,引用计数不为0,p还没有被释放,如果你打印p2.use_count()的话,应该输出1,你打印*p的话,应该输出100。

    点赞 评论
  • BostonRayAlen
    bostonAlen 2019-03-03 22:15

    p1调用的reset,p1被析构,p未改变。reset()包含两个操作。当智能指针中有值的时候,调用reset()会使引用计数减1.当调用reset(new xxx())重新赋值时,智能指针首先是生成新对象,然后将就对象的引用计数减1(当然,如果发现引用计数为0时,则析构旧对象),然后将新对象的指针交给智能指针保管。

    点赞 评论

相关推荐