据我了解,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 许可协议
你是对的,主要原因被删除了。仍然有 不使用新 指南,并且它是较少输入的原因(不必重复输入或使用单词
new
)。诚然,这些不是强有力的论据,但我真的很喜欢在我的代码中看不到new
。也不要忘记一致性。你绝对应该使用
make_shared
所以使用make_unique
是自然的并且符合模式。然后将std::make_unique<MyClass>(param)
更改为std::make_shared<MyClass>(param)
(或相反)是微不足道的,其中语法 A 需要更多的重写。