7

从我所做的研究来看,这听起来像是std::make_shared构建std::shared_ptr. 具体是因为:

  1. 与 using 相比,它只执行一次内存分配,new后者至少执行两次。
  2. 如果 ctor 传递给 make_shared throws,那么它不会泄漏,就像 new 一样。

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

4

5 回答 5

6

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

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

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

最后,虽然共享指针很棒,但它们也过于强大。很多时候,我想要一个unique_ptr或什至一个boost::scoped_ptr,或一个侵入式引用计数指针,或类似的东西来表示所有权。 只有在实际涉及资源共享shared_ptr所有权的情况下才应该使用它:因为它“容易”而随意使用它往往会导致资源等价于意大利面条代码。

于 2013-10-07T19:28:27.833 回答
2

您可能必须处理返回动态分配对象的遗留代码。在这种情况下,您需要将std::shared_ptr<T>ctor 与指针参数一起使用。使用它并不可取,std::make_shared但它确实允许您使用std::shared_ptr<T>遗留代码的所有优点。

我知道这并不完全等同于直接使用std::shared_ptr<T>ctor,new但它是std::shared_ptr<T>wheremake_shared无法使用的有效用例。

于 2013-10-07T18:50:13.377 回答
1

我对你的问题的解释有点不确定。我假设使用 a 是合理的shared_ptr<T>;我只能对Yakk表示您一开始不想使用的原因shared_ptr

有一种情况你不能使用make_sharedallocate_shared构造 ,但你需要使用相应shared_ptrctor:如果你需要传入自定义删除器,请参阅.shared_ptr

于 2013-10-07T19:43:26.027 回答
0

我在具有私有构造函数(来自静态工厂方法)的类上使用 make_shared 时遇到了问题。我不认为有一个简单的解决方案。

于 2013-10-07T19:13:23.550 回答
0

我应该一直使用 make_shared,还是在某些情况下首选 new

make_sharedshared_ptr当我们存储由其他人分配的裸指针时是不允许的。它只能调用public构造函数。然而,一些编译器中有一些关于使用 make_shared 访问受保护的构造函数的报告,如下所示

于 2013-10-07T20:16:16.933 回答