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

std::unique_ptr::reset and constructor exceptions

本文关键字:构造函数 异常 reset ptr unique Std      更新时间:2023-10-16

如果初始化unique_ptr:

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

但是从Foo::Foo()抛出异常,问题是:分配的内存发生了什么?unique_ptr如何避免它被泄露?这是new操作内部处理的东西吗?

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

是这样吗?

如果在Foo的构造函数中抛出异常,那么唯一指针的reset函数从一开始就不会被执行。因此,唯一指针保留其原始值。

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