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

C++ 谁负责释放std::move移动的资源?,c++,oop,c++11,C++,Oop,C++11,考虑以下崩溃的简单代码: #include <iostream> struct test { int *x; test(){ x = new int;} ~test(){delete x;} }; int main() { test x; test y = std::move(x); return 0; } #包括 结构测试 { int*x; test(){x=new int;} ~test(){delete x;} }; int

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

#include <iostream>

struct test 
{
    int *x;
    test(){ x = new int;}
    ~test(){delete x;}
};
int main() {
    test x;
    test y = std::move(x);
    return 0;
}
#包括
结构测试
{
int*x;
test(){x=new int;}
~test(){delete x;}
};
int main(){
测试x;
测试y=标准::移动(x);
返回0;
}
我的问题是,当对象的资源被
std::move
移动时,当它的析构函数被称为对象超出范围的自然过程时,会发生什么?这是否意味着我们不应该为堆栈上的对象调用
std::move

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

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

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

附言:别忘了

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

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

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

对象的作者负责遵守

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


或者,
int*x成员可以替换为智能指针,这样就不需要自定义析构函数,并且遵循

因为您没有移动构造函数,实际上只是复制指针,这将导致双重空闲。移动构造函数会设置
x.x=nullptr
导致
x
的析构函数是无害的。最好的解决方法是使用
std::unique_ptr
来拥有指针,它知道如何移动、移动分配和清理。@code707在这种情况下,默认的移动构造函数只复制指针。阅读:也许“规则3”和“规则5”是有用的?由于用户定义的析构函数,在
test
类中没有默认的移动构造函数。您有一个默认的复制构造函数,它将按元素复制成员(如果您有一个隐式定义的移动构造函数,它也会这样做),并且当退出
main
时,您将有一个双重删除。