C++ C++;11:如果对象是使用make_shared构建的,那么它是如何删除的

C++ C++;11:如果对象是使用make_shared构建的,那么它是如何删除的,c++,c++11,shared-ptr,reference-counting,weak-ptr,C++,C++11,Shared Ptr,Reference Counting,Weak Ptr,我缺少一些关于共享/弱点的信息: 当使用make_shared构造共享\u ptr时,仅使用一个内存分配(为控制块和对象本身分配内存)。当最后一个共享的\u ptr被销毁,但还剩下弱的\u ptr-s时会发生什么?此时,必须取消分配托管对象。但是,如果由make_shared分配的内存被解除分配,这将使弱指针无效,因为相同的解除分配将破坏控制块。对于make_shared和allocate_shared,只有一个引用控制块包含对象本身。它看起来像这样: struct internal_memor

我缺少一些关于共享/弱点的信息:


当使用
make_shared
构造
共享\u ptr
时,仅使用一个内存分配(为控制块和对象本身分配内存)。当最后一个
共享的\u ptr
被销毁,但还剩下
弱的\u ptr
-s时会发生什么?此时,必须取消分配托管对象。但是,如果由
make_shared
分配的内存被解除分配,这将使弱指针无效,因为相同的解除分配将破坏控制块。

对于
make_shared
allocate_shared
,只有一个引用控制块包含对象本身。它看起来像这样:

struct internal_memory_type
{
    unsigned char[sizeof T] buf;   // make sure the object is at the top for
                                   // efficient dereferencing!
    // book keeping data
} internal_memory;
对象是就地构造的:
::new(internal_memory.buf)T(args…)

整个块的内存是通过
::operator new
分配的,或者如果是
allocate\u shared
,则通过分配器的
allocate()
函数分配


当对象不再需要时,会对对象本身调用析构函数,例如
internal_memory.buf->~T()。当不再需要引用控制块时,即当所有弱引用和所有强引用都消失时,引用控制块作为一个整体通过
::运算符delete
,或使用分配器的
deallocate()
函数
allocate\u shared

20.7.2.2.6/6:备注:鼓励但不要求实现只执行一次内存分配因此,当共享指针计数变为零时,对象内存可能不会立即释放,只调用析构函数?@user2052436:自然:-)还有一个问题:这意味着如果存在一个弱指针循环,即使没有共享指针,内存也会在整个程序生命周期中消耗掉?@user2052436:问题是,a和B没有保留循环的问题是:你有两个智能指针,它们都死掉了,但它们保持了资源的活力。一旦所有指向A的共享指针都消失了,A——以及它所包含的弱指针——将被销毁。@user2052436:再想想循环的问题是什么:你有两个智能指针,它们都死掉了,但它们保持了资源的活力。弱指针不会发生这种情况。Wh所有的弱指针都会消失,资源也会消失。弱指针不会互相观察,而是共同的共享指针。