移动语义只是一个浅层副本并将其他指针设置为null吗?

时间:2017-01-02 09:23:41

标签: c++ c++11 copy move semantics

我一直在阅读C ++中关于移动语义的内容,并且在解释中人们提供了很多类比来帮助简化它,而在我的脑海中,我只能看到人们称之为"移动&# 34;而不是"复制"只是对象的浅层副本,并在"移动来自"中设置任何指针。对象为null。这基本上是要点吗?浅拷贝并将其他指针设置为null?

2 个答案:

答案 0 :(得分:6)

  

浅拷贝并将其他指针设置为null?

浅拷贝 - 是的。将其他指针设置为null - 并非总是如此。

最低要求是移动的对象处于“未定义但有效的状态”,也就是说您可以重新分配它,再次移动它或删除它而不会导致程序失败,但执行no其他依赖国家的操作。这意味着在std::swap

方面实现移动分配通常是完全有效的

某些对象定义了更强的合同。其中之一是std::unique_ptr。移动其中一个将导致它包含null,但这是明确记录的。

答案 1 :(得分:3)

  

移动语义只是一个浅表副本并将其他指针设置为null吗?

如果指针为null,则可以满足类不变量。也就是说:如果具有空指针的对象是有效状态。

所以,我会给出一个更长的描述:移动构造函数和赋值运算符执行浅复制,并将移动的对象清理为满足类不变量的状态。

还要记住,在移动分配的情况下,您必须记住处理将被吞下副本覆盖的指针。

例如,如果类拥有尖头对象,则不变量要求没有两个对象拥有相同的对象。至少有三种方法可以实现这一点:

  • 将指针设置为null
  • 构建新对象
  • 使用移动的对象交换指针(在移动构造函数的情况下,这基本上与之前的选项之一相同,因为指针最初未初始化,除非先前执行了之前的一个,但是移动赋值很方便照顾移动对象先前指向的对象。

如果不变量需要,有时还需要设置非size字段或类似的非资源数据以匹配对象的新状态。除了拥有指向内存的指针(例如文件描述符)之外,对象可能还有其他资源,也必须清除它们。