C ++ 11:如果使用make_shared构造对象,如何删除对象

时间:2013-08-28 20:33:04

标签: c++ c++11 shared-ptr reference-counting weak-ptr

我遗漏了一些有关共享/弱指针的内容:

当使用shared_ptr构造make_shared时,仅使用一个内存分配(为控制块和对象本身分配内存)。当上一个shared_ptr被销毁但有weak_ptr - s时会发生什么?此时必须取消分配托管对象。但是如果make_shared分配的内存被释放,那么弱指针就会失效,因为同样的解除分配会破坏控制块。

1 个答案:

答案 0 :(得分:8)

使用make_sharedallocate_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_shared分配了allocate()功能。

当不再需要该对象时,会在对象本身上调用析构函数,例如internal_memory.buf->~T();。当不再需要参考控制块时,即当所有弱引用都已消失以及所有弱引用都消失时,整个引用控制块将被::operator delete释放,或者与分配器一起释放。 deallocate()的{​​{1}}函数。