【发布时间】:2019-05-21 02:01:10
【问题描述】:
据我了解,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+ 中使用 std::make_unique 而不是 std::unique_ptr 的构造函数+17?你能举一些例子吗?
到目前为止,我能想象的唯一原因是它只允许输入一次MyClass(假设您不需要依赖std::unique_ptr<Base>(new Derived(param)) 的多态性)。然而,这似乎是一个很弱的理由,尤其是当std::make_unique 不允许指定删除器而std::unique_ptr 的构造函数允许指定删除器时。
为了清楚起见,我并不是主张从标准库中删除std::make_unique(至少为了向后兼容保持它是有意义的),而是想知道是否仍然存在强烈的情况首选std::unique_ptr
【问题讨论】:
-
但是,这似乎是一个很弱的理由 --> 为什么这是一个弱的理由?它有效地减少了代码类型的重复。至于删除器,您在使用
std::unique_ptr时使用自定义删除器的频率如何?这不是反对make_unique的论据 -
我说这是一个很弱的理由,因为如果一开始就没有
std::make_unique,我认为这不足以将其添加到 STL 中,尤其是当它是一种语法时比使用构造函数更不具有表现力,而不是更多 -
如果你有一个程序,用 c++14 创建,使用 make_unique,你不希望函数从 stl 中删除。或者,如果您希望它向后兼容。
-
@Serge 这是一个很好的观点,但它有点超出我的问题的对象。我将进行编辑以使其更清晰
-
@Eternal 请停止将 C++ 标准库称为 STL,因为它不正确并会造成混淆。见stackoverflow.com/questions/5205491/…
标签: c++ c++17 unique-ptr