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

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条回答 默认 最新

  • klavien 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。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器