我最近一直在阅读有关std::make_shared
功能的内容。据我在Effective Modern C++
一书中所理解的那样,make函数应该是首选,除非:
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函数1}}。
答案 0 :(得分:6)
这是一个微不足道的问题,不成比例。这是一个问题的唯一情况是,如果对象很大(相对于可用内存),则大小是对象的基本大小(而不是析构函数(对象或其任何成员)可以释放的内存),弱指针可能会显着超过对象。这是一种罕见的案例组合,几乎从不重要。