std::shared_ptr、std::weak_ptr 和控制块

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

我最近一直在阅读有关 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::make_shared 可能不适合,如果有一个活着的 std::weak_ptr 指向它。

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

我担心的一点是:如果我设计了一个class,它使用了std::make_shared,以后使用std::weak_ptr,我必须回去更换make使用常规 std::shared_ptr<Class>(new Class()).

函数

这是一个微小的边缘问题,被夸大了。这是一个问题的唯一情况是如果对象很大(相对于可用内存),大小是对象的基本大小(不是析构函数(对象或其任何成员的)可以释放的内存),而弱指针很可能比对象的寿命长得多。这是一种罕见的案例组合,几乎不重要。