如果像这样初始化unique_ptr
:
std::unique_ptr<Foo> i;
i.reset( new Foo() );
但是从Foo::Foo()
引发异常,问题是:分配的内存会发生什么? unique_ptr如何避免泄露?这是在new
运算符中处理的内容吗?
当范围退出时,肯定会调用析构函数。由于reset
调用在new Foo()
返回之前不会被调用,因此似乎必须由new
处理,通过在异常离开构造函数时释放分配的内存。
这是怎么回事?
答案 0 :(得分:10)
如果在Foo
的构造函数中抛出异常,则首先执行唯一指针的reset
函数。因此,唯一指针保留其原始值。
如果对象构造抛出异常,则new
表达式不会泄漏内存。