为什么在 C 17 中使用 std::make_unique?

新手上路,请多包涵

据我了解,C++14 引入了 std::make_unique 因为,由于未指定参数评估顺序,这是不安全的:

 f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A

(说明:如果求值先为原始指针分配内存,然后调用 g() 并在 std::unique_ptr 构造之前抛出异常,则内存泄漏。)

调用 std::make_unique 是一种限制调用顺序的方法,从而使事情变得安全:

 f(std::make_unique<MyClass>(param), g());             // Syntax B


从那时起,C++17 已经澄清了评估顺序,使得语法 A 也安全,所以这是我的问题: 是否还有理由使用 std::make_unique 而不是 std::unique_ptr 的构造函数C++17?你能举一些例子吗?

到目前为止,我能想象的唯一原因是它只允许键入 MyClass 一次(假设您不需要依赖 std::unique_ptr<Base>(new Derived(param)) 的多态性)。但是,这似乎是一个非常薄弱的理由,尤其是当 std::make_unique 不允许指定删除器而 std::unique_ptr 的构造函数允许指定删除器时。

为了清楚起见,我并不是主张从标准库中删除 std::make_unique (至少为了向后兼容性保持它是有意义的),而是想知道是否仍然存在这种情况强烈首选 std::unique_ptr

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

阅读 2.9k
2 个回答

你是对的,主要原因被删除了。仍然有 不使用新 指南,并且它是较少输入的原因(不必重复输入或使用单词 new )。诚然,这些不是强有力的论据,但我真的很喜欢在我的代码中看不到 new

也不要忘记一致性。你绝对应该使用 make_shared 所以使用 make_unique 是自然的并且符合模式。然后将 std::make_unique<MyClass>(param) 更改为 std::make_shared<MyClass>(param) (或相反)是微不足道的,其中语法 A 需要更多的重写。

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

原因是没有重复的代码更短。相比

f(std::unique_ptr<MyClass>(new MyClass(param)), g());
f(std::make_unique<MyClass>(param), g());

您保存 MyClassnew 和大括号。与 ptr 相比,它的 make 成本只增加了一个字符。

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

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