c++ - 有没有我不会使用 std::make_shared 的情况?

标签 c++ memory-management c++11 shared-ptr smart-pointers

根据我所做的研究,这听起来像 std::make_shared是构建 std::shared_ptr 的首选方式。具体是因为:

  1. 它只执行一次内存分配,而使用 new 则至少执行两次。
  2. 如果传递给 make_shared 的 ctor 抛出异常,那么它就不会像 new 那样泄漏。

我的问题是,假设我想要一个 shared_ptr,我应该总是使用 make_shared,还是在某些情况下首选 new

最佳答案

由于计数器和对象共享相同的分配,因此它们也共享相同的释放。

计数器必须持续到最后一个 shared_ptrweak_ptr 消失。如果您有一个大对象(或许多小对象)具有持久的 weak_ptr,如果您通过 make_shared< 分配 shared_ptr,这可能会导致内存争用.

其次,如果您有一个向您提供指针或资源句柄的第 3 方 API,并且可能有其自己的处置功能,则 make_shared 既不合适也不可能在所有情况下都使用。创建您自己的 make_ 函数可以将杂乱的细节排除在外,让您可以处理这个问题,并处理异常极端情况。

最后,虽然共享指针很棒,但它们也过于强大。我经常需要一个 unique_ptr 甚至 boost::scoped_ptr,或者一个侵入式引用计数指针,等等来表示所有权。 shared_ptr 仅当情况实际涉及资源的共享所有权时才应使用:随意使用它因为它“简单”往往会得到等同于意大利面条的资源代码。

关于c++ - 有没有我不会使用 std::make_shared 的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232306/

相关文章:

c++ - 引用和指针的 const_cast

c++ - 2个不同的数组,一个分配

iphone - Objective-C 自定义二传手

c++ - 修复重载运算符 '+' 的使用不明确?

c++ - std::codecvt_utf8_utf16 不会在大端中将 utf-8 转换为 utf-16

c++ - 奇怪的错误 : cannot convert from 'int' to 'ios_base::openmode'

c++ - 将 enable_if 与结构特化一起使用

c++ - C++ STL 中 hash_set::size() 的复杂性是多少?

c - 如何管理传递的许多小对象的分配?

c++ - 可以延长初始化列表中对象的生命周期吗?