谁负责释放由 std::move 移动的资源?



考虑下面崩溃的简单代码:

#include <iostream>
struct test 
{
int *x;
test(){ x = new int;}
~test(){delete x;}
};
int main() {
test x;
test y = std::move(x);
return 0;
}

我的问题是,当对象的资源被std::move移动时,当它的析构函数被称为对象超出范围的自然过程时会发生什么?这是否意味着我们不应该为堆栈上的对象调用std::move

这是否意味着我们不应该为堆栈上的对象调用std::move

不,这意味着您应该提供一个移动构造函数,该构造函数会将x设置为 null。

请注意,在您的案例中没有默认的移动构造函数,因为您定义了自己的析构函数 (ref(。

PS:不要忘记5法则。

谁负责释放由 std::move 移动的资源?

对象的作者有责任遵守五法则

由于test需要自定义删除程序,因此还假定需要自定义移动和复制操作。

或者,可以将int *x;成员替换为智能指针,从而消除对自定义析构函数的需求并遵守零规则

谁负责释放std::move移动的资源?

将数据移动到的对象。 从中移动数据的对象必须可以安全使用和销毁。

最新更新