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
时,您将有一个双重删除。