考虑下面崩溃的简单代码:
#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
移动的资源?
将数据移动到的对象。 从中移动数据的对象必须可以安全使用和销毁。