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

nad*_*der 2 c++ std

我想知道何时将新的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());
Run Code Online (Sandbox Code Playgroud)

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

Ath*_* vk 6

在前一个实例的析构函数之前调用构造函数的原因是因为您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));
Run Code Online (Sandbox Code Playgroud)

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