std::make_unique 和 std::unique_ptr 与 new 的区别

新手上路,请多包涵

std::make_unique 是否有像 std::make_shared 这样的效率优势?

与手动构建 std::unique_ptr 相比:

 std::make_unique<int>(1);         // vs
std::unique_ptr<int>(new int(1));

原文由 NFRCR 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

make_unique 背后的动机主要有两个方面:

  • make_unique 可以安全地创建临时对象,而明确使用 new 您必须记住不使用未命名临时对象的规则。
   foo(make_unique<T>(), make_unique<U>()); // exception safe

  foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*

  • 添加 make_unique 最后意味着我们可以告诉人们“从不”使用 new 而不是之前的规则“从不”使用 new 一个 unique_ptr “。

还有第三个原因:

  • make_unique 不需要冗余类型使用。 unique_ptr<T>(new T()) -> make_unique<T>()

没有一个原因涉及使用 make_shared 的方式提高运行时效率(由于避免了第二次分配,代价是可能更高的峰值内存使用率)。

\* 预计 C++17 将包含一个规则更改,这意味着这不再是不安全的。请参阅 C++ 委员会论文 P0400R0P0145R3

原文由 bames53 发布,翻译遵循 CC BY-SA 3.0 许可协议

std::make_uniquestd::make_shared 有两个原因:

  1. 这样您就不必显式列出模板类型参数。
  2. 使用 std::unique_ptrstd::shared_ptr 构造函数的额外异常安全性。 (请参阅 此处 的注释部分。)

这与运行时效率无关。有一点关于控制块和 T 被一次性分配,但我认为这更多的是奖励,而不是这些功能存在的动机。

原文由 Timothy Shields 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题