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

Is move semantics just a shallow copy and setting other's pointers to null?

本文关键字:其他人 副本 指针 null 设置 是否 语义 一个 移动      更新时间:2023-10-16

我一直在阅读C++中的移动语义,在解释中,人们给出了很多类比来帮助简化它,在我的脑海中,我所能看到的是,人们所说的"移动"而不是"复制"只是对象的浅层副本,并将"从"对象中的任何指针设置为null。这基本上就是要点吗?浅拷贝并将其他指针设置为null?

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

浅拷贝-是。将他人的指针设置为null-并不总是。

最低要求是移动的from对象处于"未定义但有效的状态",也就是说,您可以重新分配给它,再次移动它或删除它,而不会导致程序失败,但不会对它执行其他依赖于状态的操作。这意味着,根据std::swap实现移动分配通常是完全有效的。

有些对象定义了更强的契约。其中之一是CCD_ 2。从其中一个移动会导致它包含null,但这是明确记录的。

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

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

因此,我将给出一个更长的描述:Move构造函数和赋值运算符执行一个浅层复制,并将moved-from对象清理到满足类不变量的状态。

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

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

  • 将指针设置为null
  • 构造新对象
  • 将指针与移动到的对象交换(在移动构造函数的情况下,这基本上与前面的一个选项相同,因为除非首先执行前面的某个选项,否则指针最初是未初始化的,但通过移动赋值,这可以方便地处理移动到对象之前指向的对象)

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