std :: unique_ptr析构函数构造函数顺序

纳德

我想知道将新的unique_ptr分配给先前的unique_ptr时会发生什么。在下面的代码中:

std::unique_ptr<my_class> test;
......
test = std::unique_ptr<my_class>(new my_class());
......
test = std::unique_ptr<my_class>(new my_class());

我期望第二次分配新的std :: unique_ptr进行测试时,首先调用my_class的析构函数,然后调用它的构造函数。我期望的是错误的吗?但是当我调试代码时,我看到的是相反的。首先调用my_class的构造函数,然后调用它的析构函数。

阿陀斯vk

之所以要在前一个实例的析构函数之前调用构造函数,是因为您要将其new my_class()作为参数传递给unique_ptr的构造函数。首先对参数进行求值,构造一个新的unique_ptr实例,该实例获取新创建的对象的所有权,然后将该新的unique_ptr实例分配给旧对象。

结果,拥有所有权的旧unique_ptr的my_class对象将被释放并销毁,从而调用my_class析构函数。

它实际上与您编写的内容相同:

my_class* temp = new my_class;
test = std::unque_ptr<my_class>(std::move(temp));

在这里可以直接看到新对象是首先构造的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: unique_ptr是否在其析构函数中将其基础指针设置为nullptr?

std::unique_ptr 在虚拟析构函数上重置 SIGABRT

thread_local std :: unique_ptr版本未调用析构函数

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

为什么要为具有非平凡析构函数的类声明constrexpr构造函数(例如unique_ptr,std :: variant)

std :: unique_ptr constexpr构造函数

std :: unique_ptr构造函数的行为

如何允许 std::unique_ptr 访问类的私有析构函数或使用私有析构函数实现 C++ 工厂类?

使用std :: map时,包含unique_ptr的结构中的默认析构函数会导致编译错误

结合 std::unique_ptr 和命名构造函数

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

std :: list <std :: unique_ptr>:空的初始化列表与默认构造函数

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

unique_ptr析构函数的优势

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

移动std :: unique_ptr的构造函数/分配:内存重新分配?

没有合适的默认构造函数可用于std :: unique_ptr

将std :: unique_ptr传递给构造函数以获取所有权

为什么std :: unique_ptr构造函数接受外部指针

为什么std :: unique_ptr构造函数接受外部指针?

C ++如何从采用构造函数参数的类中创建std :: unique_ptr

我是否需要在构造函数中显式初始化std :: unique_ptr?

std :: unique_ptr,默认副本构造函数和抽象类

查看std :: unique_ptr及其nullptr_t构造函数

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

可连接std :: thread的析构函数

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

为什么std :: vector的构造函数调用自定义类的析构函数?