首页 > 解决方案 > 为什么在 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 也安全,所以这是我的问题:还有理由在 C++17 中使用std::make_uniqueoverstd::unique_ptr的构造函数吗?你能举一些例子吗?

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

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

标签: c++c++17unique-ptr

解决方案


你是对的,主要原因被删除了。仍然有不使用新准则和减少打字的原因(不必重复打字或使用单词new)。诚然,这些不是强有力的论据,但我真的很喜欢new在我的代码中看不到。

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


推荐阅读