我错过了一些关于共享/弱指针的东西:
当 ashared_ptr
使用 构造时make_shared
,仅使用一次内存分配(为控制块和对象本身分配内存)。当 lastshared_ptr
被销毁但还weak_ptr
剩下 -s 时会发生什么?此时必须释放托管对象。但是如果分配的内存make_shared
被释放,那将使弱指针无效,因为相同的释放会破坏控制块。
我错过了一些关于共享/弱指针的东西:
当 ashared_ptr
使用 构造时make_shared
,仅使用一次内存分配(为控制块和对象本身分配内存)。当 lastshared_ptr
被销毁但还weak_ptr
剩下 -s 时会发生什么?此时必须释放托管对象。但是如果分配的内存make_shared
被释放,那将使弱指针无效,因为相同的释放会破坏控制块。
使用make_shared
and 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
。