我遗漏了一些关于共享/弱指针的信息:
当使用make_shared
构造shared_ptr
时,只使用一次内存分配(为控制 block 和对象本身分配内存)。当最后一个 shared_ptr
被销毁但还剩下 weak_ptr
时会发生什么?此时必须释放托管对象。但是,如果由 make_shared
分配的内存被释放,那会使弱指针无效,因为相同的释放会破坏控制 block 。
最佳答案
使用make_shared
和allocate_shared
,只有一个包含对象本身的引用控制 block 。它看起来像这样:
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...)
。
整个 block 的内存使用 ::operator new
分配,或者在 allocate_shared
的情况下使用分配器的 allocate()
函数。
当不再需要对象时,会调用对象本身的析构函数,类似于 internal_memory.buf->~T();
。当不再需要引用控制 block 时,即当所有弱引用和所有强引用都消失时,引用控制 block 作为一个整体被释放 ::operator delete
,或者allocate_shared
的分配器的 deallocate()
函数。
关于C++11:如果对象是使用 make_shared 构造的,如何删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497659/