从我所做的研究来看,这听起来像是std::make_shared
构建std::shared_ptr
. 具体是因为:
- 与 using 相比,它只执行一次内存分配,
new
后者至少执行两次。 - 如果 ctor 传递给 make_shared throws,那么它不会泄漏,就像 new 一样。
我的问题是,假设我想要一个 shared_ptr,我应该总是使用make_shared
,还是有new
首选的情况?
从我所做的研究来看,这听起来像是std::make_shared
构建std::shared_ptr
. 具体是因为:
new
后者至少执行两次。 我的问题是,假设我想要一个 shared_ptr,我应该总是使用make_shared
,还是有new
首选的情况?
由于计数器和对象共享相同的分配,它们也共享相同的释放。
计数器必须坚持到最后shared_ptr
并weak_ptr
消失。如果你有一个大对象(或许多小对象)和持久weak_ptr
的 s,如果你shared_ptr
通过 s分配 s,这可能会导致内存争用make_shared
。
其次,如果您有一个向您提供指针或资源句柄的 3rd 方 API,并且可能具有自己的处置功能,那么make_shared
在每种情况下都不合适也不可能使用。创建自己的make_
函数可以避免杂乱的细节让您处理这个问题,并处理异常极端情况。
最后,虽然共享指针很棒,但它们也过于强大。很多时候,我想要一个unique_ptr
或什至一个boost::scoped_ptr
,或一个侵入式引用计数指针,或类似的东西来表示所有权。 只有在实际涉及资源共享shared_ptr
所有权的情况下才应该使用它:因为它“容易”而随意使用它往往会导致资源等价于意大利面条代码。
您可能必须处理返回动态分配对象的遗留代码。在这种情况下,您需要将std::shared_ptr<T>
ctor 与指针参数一起使用。使用它并不可取,std::make_shared
但它确实允许您使用std::shared_ptr<T>
遗留代码的所有优点。
我知道这并不完全等同于直接使用std::shared_ptr<T>
ctor,new
但它是std::shared_ptr<T>
wheremake_shared
无法使用的有效用例。
我对你的问题的解释有点不确定。我假设使用 a 是合理的shared_ptr<T>
;我只能对Yakk表示您一开始不想使用的原因shared_ptr
。
有一种情况你不能使用make_shared
或allocate_shared
构造 ,但你需要使用相应的shared_ptr
ctor:如果你需要传入自定义删除器,请参阅.shared_ptr
我在具有私有构造函数(来自静态工厂方法)的类上使用 make_shared 时遇到了问题。我不认为有一个简单的解决方案。
我应该一直使用 make_shared,还是在某些情况下首选 new
make_shared
shared_ptr
当我们存储由其他人分配的裸指针时是不允许的。它只能调用public
构造函数。然而,一些编译器中有一些关于使用 make_shared 访问受保护的构造函数的报告,如下所示。