C++11:执行移动操作以更改地址

C++11: Does a move operation change the address?

本文关键字:地址 操作 执行 移动 C++11      更新时间:2023-10-16

假设我有一个主类SomeManager,用于跟踪另一个类SomeClass的实例。当构造SomeClass时,它调用SomeManager的方法,将指针传递给它自己。然后SomeManager获取该指针并将其推送到向量中。SomeClass的析构函数调用SomeManager的另一个函数,该函数将其指针从向量中移除。

所以,我的问题是,当SomeClass的实例通过move运算符或构造函数移动时。地址变了吗?我必须删除旧地址并添加新地址吗?

从我读到的内容来看,我对此有一些想法,但我不确定,我不想把事情搞砸。

简短回答:不,从对象移动的地址不会改变。但旧物体可能不是一个有用的状态。

执行移动构造时,您正在创建一个新对象,并将另一个对象的内容移动到新对象中。新对象将始终构建在与旧对象不同的内存位置。移动分配也会发生类似的情况:你只需将一个对象的内容移动到另一个对象,但你仍然必须在两个不同的内存位置有两个不同对象才能执行分配(好吧,有自分配,但我们将忽略这一点)。旧对象仍然存在(好吧,它可能是一个在语句结束时被销毁的临时对象),但大多数时候,除了它处于某种有效状态之外,您对旧对象没有任何保证。

一个类比可以是一个装满家具的房子。搬迁施工就像建造一栋新房子并将家具搬到它上面。搬迁任务就像<em]购买第二栋先前存在的房子>

是。move构造函数和赋值运算符帮助SomeClass的新实例拥有旧实例的状态,但新实例有一个不同的地址。

您需要考虑的一个问题是,您是否希望从SomeClass中删除的实例在从SomeManager移动时"取消注册"自己,而不是等待销毁——这是否重要取决于您的确切代码。

Move构造本质上意味着"这是一个对象X。通过窃取X的内部来创建一个新对象Y。"类似于Move赋值。你不会移动物体;你移动它的内容。

从中移动的对象X的地址保持不变。它的内容可能会改变(例如,变为空),也可能不会(例如,如果它是一个移动是副本的基元类型)。

尽管在您描述的方案中,您最好确保move构造函数也注册它创建的对象。。。