4

我错过了一些关于共享/弱指针的东西:

当 ashared_ptr使用 构造时make_shared,仅使用一次内存分配(为控制块和对象本身分配内存)。当 lastshared_ptr被销毁但还weak_ptr剩下 -s 时会发生什么?此时必须释放托管对象。但是如果分配的内存make_shared被释放,那将使弱指针无效,因为相同的释放会破坏控制块。

4

1 回答 1

9

使用make_sharedand 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_shared是分配器的allocate()函数。

当不再需要对象时,会在对象本身上调用析构函数,例如internal_memory.buf->~T();. 当不再需要引用控制块时,即当所有弱引用以及所有强引用都消失时,引用控制块作为一个整体被释放::operator delete,或分配器的deallocate()函数 for allocate_shared

于 2013-08-28T20:35:05.843 回答