C++11:移动操作会改变地址吗?

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

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

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

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

是的。移动构造函数和赋值运算符帮助 SomeClass 的新实例获得旧实例状态的所有权,但新实例具有不同的地址。

您需要考虑的一个问题是,您是否希望从 SomeClass 移除实例到 "un-register" 本身,因为它是从 SomeManager 移动还是等待销毁 - 这是否重要取决于在你的确切代码上。

移动构造本质上意味着"Here is an object X. Create a new object Y by stealing the innards of X."类似于移动赋值。你不移动物体;你移动它的内容。

移出对象的地址X保持不变。它的内容可能会改变(例如,变成空的),也可能不会(例如,如果它是一个原始类型,移动是一个副本)。

尽管在您所描述的方案中,您最好确保移动构造函数也注册了它创建的对象...

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

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

打个比方,房子里摆满了家具。搬家施工就像建造新房子然后把家具搬进去。搬家任务就像 购买第二套二手房 并将家具搬进去。在这两种情况下,新房子的地址都与旧房子不同,但旧房子仍然存在。只是可能没有什么用处(没有家具的房子很难住!)。