Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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';拥有';共享的ptr?_C++_C++11_Shared Ptr_Weak Ptr_Make Shared - Fatal编程技术网

C++ 弱ptr';拥有';共享的ptr?

C++ 弱ptr';拥有';共享的ptr?,c++,c++11,shared-ptr,weak-ptr,make-shared,C++,C++11,Shared Ptr,Weak Ptr,Make Shared,我试着为这个问题写了10分钟的标题,你会看到我最终失败了。[编者按:我想我已经解决了这个问题。] 我正在阅读,主题是使用std::make_shared及其优缺点。请参阅所附照片: 这是一篇非常有趣的文章的一小部分,我强烈推荐大家阅读。我的问题是关于这句话: “弱参考”计数,用于跟踪当前观察对象的弱PTR的数量。当最后一个弱引用消失时,共享内务管理控制块将被销毁并解除分配(如果共享对象尚未解除分配,则会解除分配)** 我真的不明白这句话。最初,当我们通过make_shared创建std::sh

我试着为这个问题写了10分钟的标题,你会看到我最终失败了。[编者按:我想我已经解决了这个问题。]

我正在阅读,主题是使用std::make_shared及其优缺点。请参阅所附照片:

这是一篇非常有趣的文章的一小部分,我强烈推荐大家阅读。我的问题是关于这句话:

“弱参考”计数,用于跟踪当前观察对象的弱PTR的数量。当最后一个弱引用消失时,共享内务管理控制块将被销毁并解除分配(如果共享对象尚未解除分配,则会解除分配)**

我真的不明白这句话。最初,当我们通过
make_shared
创建
std::shared_ptr
时,例如
auto sp1=make_shared()
,当前没有观察sp1的弱ptr,因此当
共享\u ptr
以通常方式超出范围时,它将被删除


那么,添加弱引用如何改变这种行为呢?谁能给我解释一下吗

控制块跟踪所有弱\u ptr引用以及共享\u ptr引用。毕竟,弱ptr需要查找某个地方,以查看对象是否仍然有效


因此,在所有
shared_ptr
s和所有
weak_ptr
s被销毁之前,无法取消分配控制块。如果使用
make_-shared
,则控制块和对象一起分配,这主要是一种优化,除非对象因任何
weak_-ptr
s而过期。

简单地说,
shared_-ptr
拥有托管对象和元信息(控制块)而
弱ptr
只拥有元信息

所有权是指:

  • 当一个资源有一个所有者时,它不会被销毁(或以构建所有者“智能指针”时确定的方式“释放”)
  • 当所有所有者的生存期结束时,ressource将被销毁/释放

参考计数部分是一个实现细节。(如果您喜欢使用互斥锁而不是相对高效的原子计数器的效率非常低的实现,您可以使用一个链表。)

第二项从属于第一项:首先,您需要在执行任何操作之前,所有共享引用都已消失。然后还要等待弱引用消失,然后再解除分配控制块。因此,只有在源已删除且强计数为0?之后,由弱计数==0导致的控制块解除分配才会发生@你到底在问什么?如果强计数为非零,显然共享对象和控制块都无法释放。谢谢@Praetorian,这就是我要问的@爱德华罗斯托米扬:是的。当强计数达到0时,所拥有的对象将被销毁,并且无法取出更多的共享。然后,一旦弱指针计数达到0,控制块将被销毁。如果没有弱指针,则两个事件重合。“如果使用“使_共享”,则控制块和对象一起分配,这主要是一种优化,除非对象因任何弱_ptr而延长寿命。”-我只想指出,即使分配的内存(包含控制块和对象)未在所有共享/弱指针之前解除分配,对象也可能在最后一个共享指针之后被销毁。@holt是的,确实会调用析构函数,但不会分配内存。不过,这一点很好。