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

时间:2016-04-09 22:17:31

标签: c++ c++11 stl shared-ptr weak-ptr

我最近一直在阅读有关std::make_shared功能的内容。据我在Effective Modern C++一书中所理解的那样,make函数应该是首选,除非:

  1. 自定义内存管理已到位。
  2. 有一些内存问题,例如std::weak_ptr可能比其std::shared_ptr更长,处理大型对象,自定义删除等等。
  3. 所以,我理解std::make_shared只需一次调用即可在堆及其控制块上分配一个对象。因此,问题是std::shared_ptr的对象可能不会被删除,直到必须释放控制块。如果我错了,请纠正我,但这是在最后std::weak_ptr被释放的时候。因此,std::make_shared可能不适合,如果存在指向它的活std::weak_ptr

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

    我关注的一点是:如果我设计一个使用std::make_shared的类,并且将来会使用std::weak_ptr,我必须返回并使用常规{{替换make函数1}}。

1 个答案:

答案 0 :(得分:6)

这是一个微不足道的问题,不成比例。这是一个问题的唯一情况是,如果对象很大(相对于可用内存),则大小是对象的基本大小(而不是析构函数(对象或其任何成员)可以释放的内存),弱指针可能会显着超过对象。这是一种罕见的案例组合,几乎从不重要。