有什么区别:
std::shared_ptr<int> p = std::shared_ptr<int>( new int );
and
std::shared_ptr<int> p = std::make_shared< int >();
?
我应该选择哪一个,为什么?
P.S. 很确定这一定已经得到回答,但我找不到类似的问题。
这两个例子都比必要的更加冗长:
std::shared_ptr<int> p(new int); // or '=shared_ptr<int>(new int)' if you insist
auto p = std::make_shared<int>(); // or 'std::shared_ptr<int> p' if you insist
有什么不同?
主要区别在于第一个需要两次内存分配:一次用于托管对象(new int
),还有一个用于引用计数。make_shared
应该分配一个内存块,并在其中创建两个内存块。
我应该选择哪一个,为什么?
你通常应该使用make_shared
因为它更有效率。正如另一个答案中所述,它还避免了内存泄漏的任何可能性,因为您永远不会有指向托管对象的原始指针。
然而,正如评论中指出的,它有一个潜在的缺点,如果仍然存在弱指针阻止共享计数被删除,那么当对象被销毁时,内存将不会被释放。
编辑2020/03/06:
进一步的建议还来自微软官方文档 https://learn.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-shared-ptr-instances?view=vs-2019以及相关的例子。将注意力集中在实施例1片段:
只要有可能,就使用 make_shared 函数创建一个shared_ptr
第一次创建内存资源时。 make_shared 是
异常安全。它使用相同的调用来分配内存
控制块和资源,减少了构建
高架。如果你不使用 make_shared,那么你必须使用
在将对象传递给之前显式的 new 表达式来创建该对象
Shared_ptr 构造函数。以下示例展示了各种方法
声明并初始化一个shared_ptr 和一个新对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)