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

时间:2018-06-04 16:09:20

标签: 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;
}

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

3 个答案:

答案 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');移动的资源?

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