有什么区别:
std::shared_ptr<int> p = std::shared_ptr<int>( new int );
和
std::shared_ptr<int> p = std::make_shared< int >();
?
我应该更喜欢哪一个,为什么?
PS很确定这一定已经回答了,但我找不到类似的问题。
原文由 Violet Giraffe 发布,翻译遵循 CC BY-SA 4.0 许可协议
有什么区别:
std::shared_ptr<int> p = std::shared_ptr<int>( new int );
和
std::shared_ptr<int> p = std::make_shared< int >();
?
我应该更喜欢哪一个,为什么?
PS很确定这一定已经回答了,但我找不到类似的问题。
原文由 Violet Giraffe 发布,翻译遵循 CC BY-SA 4.0 许可协议
相反,声明 std::shared_ptr<T> p(new T(Args...))
执行至少两次内存分配,这可能会产生不必要的开销。
此外, 如果 g 抛出异常, f(shared_ptr<int>(new int(42)), g())
会导致内存泄漏。 如果使用 make_shared 则不存在此问题。
因此,如果可能,我会推荐 make_shared
方法。
原文由 Adri C.S. 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
这两个例子都比必要的更冗长:
主要区别在于第一个需要两个内存分配:一个用于托管对象(
new int
),另一个用于引用计数。make_shared
应该分配一个内存块,并在其中创建两者。您通常应该使用
make_shared
因为它更有效。如另一个答案所述,它还避免了内存泄漏的任何可能性,因为您永远没有指向托管对象的原始指针。但是,正如评论中所指出的,如果仍然有弱指针阻止共享计数被删除,那么当对象被销毁时,内存将不会被释放,这有一个潜在的缺点。
编辑 2020/03/06:
进一步的建议还来自带有相关示例的 官方 Microsoft 文档。继续关注 示例 1 代码段: