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

9
如果像这样初始化一个unique_ptr
std::unique_ptr<Foo> i;
i.reset( new Foo() ); 

但是在Foo::Foo()中抛出异常,问题是:分配的内存会发生什么?unique_ptr如何避免内存泄漏?这个问题是在new操作符内部处理的吗?
当作用域结束时,析构函数肯定会被调用。由于reset调用直到new Foo()返回才被调用,似乎必须由new来处理,在构造函数引发异常时释放已分配的内存。
这就是发生的吗?

请参见https://dev59.com/0G855IYBdhLWcg3w5Igb。 - Jon
1个回答

13
如果Foo的构造函数抛出异常,那么unique pointer的reset函数首先不会被执行。因此,unique pointer保留其原始值。
如果对象构建抛出异常,new表达式不会泄漏内存。

如果您有“make_unique”,则可以使用“i = make_unique<Foo>()”。 - GManNickG
不,应该没问题(没有托管指针),但我在文档中找不到任何信息。 - Nick
1
@Nick:请至少试着编译一下。 - Kerrek SB
不确定构造函数是否为显式,但这段代码应该可以正确编译 - std::unique_ptr p{ new Bla() }; - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接