根据我所做的研究,这听起来像 std::make_shared
是构建 std::shared_ptr
的首选方式。具体是因为:
- 它只执行一次内存分配,而使用
new
则至少执行两次。 - 如果传递给 make_shared 的 ctor 抛出异常,那么它就不会像 new 那样泄漏。
我的问题是,假设我想要一个 shared_ptr,我应该总是使用 make_shared
,还是在某些情况下首选 new
?
最佳答案
由于计数器和对象共享相同的分配,因此它们也共享相同的释放。
计数器必须持续到最后一个 shared_ptr
和 weak_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/