标准::shared_ptr、标准::weak_ptr和控制块

std::shared_ptr, std::weak_ptr and control block

本文关键字:标准 ptr 控制块 weak shared      更新时间:2023-10-16

我最近一直在阅读有关std::make_shared函数的信息。据我从书Effective Modern C++了解,应该首选make函数,除非:

  1. 自定义内存管理已到位。
  2. 存在内存问题,例如std::weak_ptr可能超过其std::shared_ptr,处理大型对象,自定义删除器等。

因此,我理解std::make_shared只需一次调用即可在堆及其控制块上分配一个对象。因此,问题是std::shared_ptr 的对象可能不会被删除,直到必须释放控制块。如果我错了,请纠正我,但这是发布最后一个std::weak_ptr的时候。因此,如果有一个活std::weak_ptr指向它,std::make_shared可能不合适。

但对于大多数对象来说,这仍然是一个问题吗?我们是否需要关心何时释放非大型对象的控制块?可以说,现在内存并不难获得,所以这是否只是大型对象和低内存系统的问题?

我关心的一点是:如果我设计了一个使用 std::make_shared 的类,并且将来使用std::weak_ptr,我必须返回并用常规std::shared_ptr<Class>(new Class())替换 make 函数。

这是一个很小的边缘问题,被吹得不成比例。这是问题的唯一情况是,如果对象很大(相对于可用内存(,大小是对象的基本大小(不是析构函数(对象或其任何成员(可以释放的内存(,并且弱指针可能会明显超过对象的寿命。这是一种罕见的病例组合,几乎从不重要。