C++ 为什么弱ptr会破坏循环引用?
我学到了很多关于弱ptr与共享ptr合作打破循环引用的知识。它是如何工作的?如何使用它?有谁能给我举个例子吗?我在这里完全迷路了C++ 为什么弱ptr会破坏循环引用?,c++,smart-pointers,C++,Smart Pointers,我学到了很多关于弱ptr与共享ptr合作打破循环引用的知识。它是如何工作的?如何使用它?有谁能给我举个例子吗?我在这里完全迷路了 还有一个问题,什么是强指针?它不包括在引用计数中,因此即使存在弱指针,也可以释放资源。当使用弱\u ptr时,您会从中获取一个共享\u ptr,从而临时增加引用计数。如果资源已被释放,获取共享\u ptr将失败 问题2:shared_ptr是一个强指针。只要其中任何一个存在,就无法释放资源。强指针包含对对象的强引用-意思是:只要指针存在,对象就不会被破坏 对象并不单独
还有一个问题,什么是强指针?它不包括在引用计数中,因此即使存在弱指针,也可以释放资源。当使用弱\u ptr时,您会从中获取一个共享\u ptr,从而临时增加引用计数。如果资源已被释放,获取共享\u ptr将失败
问题2:shared_ptr是一个强指针。只要其中任何一个存在,就无法释放资源。强指针包含对对象的强引用-意思是:只要指针存在,对象就不会被破坏 对象并不单独“知道”每个指针,只知道它们的编号——这就是强引用计数 一种弱的ptr类型的“记忆”对象,但不能阻止它被破坏。不能通过弱指针直接访问对象,但可以尝试从弱指针创建强指针。如果对象不再存在,则生成的强指针为空:
shared_ptr<int> sp(new int);
weak_ptr<int> wp(sp);
shared_ptr<int> stillThere(wp);
assert(stillThere); // yes, the original object still exists, we can now use it
stillThere.reset(); // releasing the strong reference
sp.reset(); // here, the object gets destroyed,
// because there's only one weak_ptr left
shared_ptr<int> notReally(wp);
assert(!notReally); // the object is destroyed,
// you can't get a strong pointer to it anymore
shared_ptr sp(新int);
弱可湿性粉剂(sp);
共享的ptr仍然存在(wp);
断言(仍然存在);//是的,原始对象仍然存在,我们现在可以使用它
仍然存在。重置();//释放强引用
sp.reset();//在这里,物体被摧毁,
//因为只剩下一个微弱的ptr了
共享(wp);
断言(!不是真的);//物体被摧毁了,
//你再也找不到强有力的指向它的指针了
代码示例很好地补充了您的解释。“它是如何工作的?”通常情况下,它不会。这是一个空洞的想法。您必须在设计级别删除循环。@curiousguy存在一些您的方法不起作用的场景,即设计引入循环引用的情况。例如,不支持GC的动态语言的解释器支持一级lambda函数,该函数通过在封闭环境中捕获其名称来允许本机递归(因此,当它是本地创建的,然后作为一级值返回时,只有它自己才能拥有它,并且必须有循环引用;这传统上称为向下funarg问题,经典的解决方案是使用GC)。