代码之家  ›  专栏  ›  技术社区  ›  code707

谁负责释放STD:“移动?”

  •  3
  • code707  · 技术社区  · 6 年前

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

    #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::移动 对于堆栈上的对象?

    3 回复  |  直到 6 年前
        1
  •  6
  •   gsamaras a Data Head    6 年前

    是不是说我们不应该打电话 std::move 对于堆栈上的对象?

    不,这意味着您应该提供一个move构造函数,它将设置 x 无效。

    注意,在您的案例中没有默认的move构造函数,因为您定义了自己的析构函数( ref )

    别忘了 rule of 5 .

        2
  •  6
  •   Drew Dormann    6 年前

    谁负责释放STD:“移动?”

    对象的作者负责遵守 Rule of Five .

    自从 test 需要自定义删除程序,也假定需要自定义移动和复制操作。

    或者说, int *x; 成员可以替换为智能指针,从而不需要自定义析构函数,并遵守 Rule of Zero .

        3
  •  3
  •   Toby Speight    6 年前

    谁负责释放 std::move ?

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