【发布时间】:2019-04-04 07:00:25
【问题描述】:
这个问题是this question 的后续问题。
make_unique可以安全地创建临时对象,而明确使用new您必须记住不使用未命名临时对象的规则
我大致了解这是什么意思,并且我理解给出的示例,但是这在内部究竟是如何工作的?这些函数具体是做什么的,区别在哪里?
【问题讨论】:
标签: c++ unique-ptr
这个问题是this question 的后续问题。
make_unique可以安全地创建临时对象,而明确使用new您必须记住不使用未命名临时对象的规则
我大致了解这是什么意思,并且我理解给出的示例,但是这在内部究竟是如何工作的?这些函数具体是做什么的,区别在哪里?
【问题讨论】:
标签: c++ unique-ptr
这些函数究竟做了什么,区别在哪里?
其实没什么神奇的。他们只是从这里转换用户代码:
f( std::unique_ptr<T1>{ new T1 }, std::unique_ptr<T2>{ new T2 } );
进入这个:
f( make_unique<T1>(), make_unique<T2>() );
只是为了避免编译器对以下操作进行排序的情况,因为它可能会在 C++14(包含)之前这样做:
new T1new T2unique_ptr
unique_ptr
如果第二步 (new T2) 抛出异常,则第一个分配的对象尚未被保护到 unique_ptr 中并泄漏。
make_unique 函数实际上写起来很简单,在 C++11 中一直被忽略。它在 C++14 中很容易引入。在这期间,每个人都会编写自己的make_unique 模板,或者在 Google 上搜索 Stephen T. Lavavej 编写的模板。
正如 StoryTeller 评论的那样,从 C++17 开始,这种交错不再被允许。
【讨论】:
unique_ptr的推导指南吗?
T* 或T[]。