`make_shared` 如何避免双重分配并允许 `release` 将托管对象的生命周期延长到超过 shared_pointer 的生命周期?
How does `make_shared` avoid double allocation and allow `release` to prolong the lifetime of the managed object beyond that of the shared_pointer?
std::shared_ptr
可以用两个成员实现,一个是指向托管资源的指针,一个是指向控制块的指针。
std::shared_ptr
可以用std::make_shared
构造,它可以将管理对象和shared_ptr
控制块的两个分配合二为一。
release
是如何工作的?它允许被管理对象比共享指针长寿,但必须在共享指针的析构函数中删除控制块。如何处理销毁和重新分配?
您不能 release
来自 shared_ptr
。它不起作用。没有该会员。
当 shared_ptr 析构函数被调用时,共享 refCount 递减。当共享 refCount 达到 0 时,对象被销毁。对于使用 make_shared 创建的对象,对象的 space 在控制块中保持未使用状态。当 weak refCount 达到 0 时,space 被释放回堆。
std::shared_ptr
可以用两个成员实现,一个是指向托管资源的指针,一个是指向控制块的指针。
std::shared_ptr
可以用std::make_shared
构造,它可以将管理对象和shared_ptr
控制块的两个分配合二为一。
release
是如何工作的?它允许被管理对象比共享指针长寿,但必须在共享指针的析构函数中删除控制块。如何处理销毁和重新分配?
您不能 release
来自 shared_ptr
。它不起作用。没有该会员。
当 shared_ptr 析构函数被调用时,共享 refCount 递减。当共享 refCount 达到 0 时,对象被销毁。对于使用 make_shared 创建的对象,对象的 space 在控制块中保持未使用状态。当 weak refCount 达到 0 时,space 被释放回堆。