gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:28:19 24 4
gpt4 key购买 nike

根据我所做的研究,这听起来像 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com