考虑下面崩溃的简单代码:
#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
对象?
答案 0 :(得分:6)
这是否意味着我们不应该在堆栈上调用
std::move
对象?
不,这意味着您应该提供了一个移动构造函数,它将x
设置为null。
请注意,在您的情况下没有默认的移动构造函数,因为您定义了自己的析构函数(ref)。
PS:不要忘记rule of 5。
答案 1 :(得分:6)
谁负责释放std :: move移动的资源?
该对象的作者负责遵守 Rule of Five 。
由于test
需要自定义删除器,因此还假定自定义移动和复制操作是必需的。
或者,可以使用智能指针替换int *x;
成员,无需自定义析构函数并遵守 Rule of Zero 。
答案 2 :(得分:3)
谁负责释放
$sp->delete('', '5');
移动的资源?
您将数据移动到的对象。您从中移动数据的对象必须安全使用和销毁。