std :: unique_ptr :: reset和构造函数异常

时间:2013-01-10 23:33:58

标签: c++ memory-management exception-handling constructor

如果像这样初始化unique_ptr

std::unique_ptr<Foo> i;
i.reset( new Foo() ); 

但是从Foo::Foo()引发异常,问题是:分配的内存会发生什么? unique_ptr如何避免泄露?这是在new运算符中处理的内容吗?

当范围退出时,肯定会调用析构函数。由于reset调用在new Foo()返回之前不会被调用,因此似乎必须由new处理,通过在异常离开构造函数时释放分配的内存。

这是怎么回事?

1 个答案:

答案 0 :(得分:10)

如果在Foo的构造函数中抛出异常,则首先执行唯一指针的reset函数。因此,唯一指针保留其原始值。

如果对象构造抛出异常,则new表达式不会泄漏内存。