std :: make_unique和std :: unique_ptr之间的区别与内部新

时间:2019-04-04 07:00:25

标签: c++ unique-ptr

这个问题是对this question的跟进。

The accepted answer状态:

  

make_unique对于创建临时文件是安全的,而显式使用new则必须记住关于不使用未命名临时文件的规则

我大致理解了这是什么意思,并且我理解了给出的示例,但是在内部它是如何工作的呢?这些功能究竟有什么作用,区别在哪里?

1 个答案:

答案 0 :(得分:5)

  

这些功能究竟有什么作用,区别在哪里?

实际上没有什么神奇的。他们只是从中转换用户代码:

f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );

对此:

f( make_unique<T1>(), make_unique<T2>() );

只是为了避免编译器按如下所示命令操作的情况,因为它可能会在C ++ 14(包括)之前执行:

  • new T1
  • new T2
  • 首先构建unique_ptr
  • 建立第二个unique_ptr

如果第二步(new T2)引发异常,则第一个分配的对象尚未固定到unique_ptr中并泄漏。

make_unique函数实际上很容易编写,但C ++ 11却忽略了它。它已在C ++ 14中轻松引入。在这两者之间,每个人都将编写自己的make_unique模板,或在Google上搜索由Stephen T. Lavavej编写的模板。

正如StoryTeller所评论的那样,自C ++ 17起,不再允许这种交织。