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

bba*_*hev 1 c++ stl shared-ptr weak-ptr c++11

我最近一直在阅读有关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指向它的活着,则可能不合适.

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

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

Dav*_*rtz 6

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