Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么弱ptr会破坏循环引用?_C++_Smart Pointers - Fatal编程技术网

C++ 为什么弱ptr会破坏循环引用?

C++ 为什么弱ptr会破坏循环引用?,c++,smart-pointers,C++,Smart Pointers,我学到了很多关于弱ptr与共享ptr合作打破循环引用的知识。它是如何工作的?如何使用它?有谁能给我举个例子吗?我在这里完全迷路了 还有一个问题,什么是强指针?它不包括在引用计数中,因此即使存在弱指针,也可以释放资源。当使用弱\u ptr时,您会从中获取一个共享\u ptr,从而临时增加引用计数。如果资源已被释放,获取共享\u ptr将失败 问题2:shared_ptr是一个强指针。只要其中任何一个存在,就无法释放资源。强指针包含对对象的强引用-意思是:只要指针存在,对象就不会被破坏 对象并不单独

我学到了很多关于弱ptr与共享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)。