让我们说我有一个主类SomeManager
来跟踪另一个班级SomeClass
的实例。构造SomeClass
时,它会调用SomeManager
自我传递指针的方法。然后SomeManager
接受该指针并将其推入向量。 SomeClass
的析构函数调用SomeManager
的另一个函数,该函数从向量中删除它的指针。
所以,我的问题是。通过移动运算符或构造函数移动SomeClass
的实例时。是否更改了地址,我必须删除旧地址并添加新地址?
我从我所读到的内容中有一些想法,但我不确定,我不想搞砸。
答案 0 :(得分:18)
简答:不,从对象移动的地址不会改变。但旧的对象可能不是一个有用的状态。
执行移动构造时,您将创建一个新对象并将另一个对象的内容移动到新对象中。新对象将始终构造在与旧对象不同的内存位置。移动分配会发生类似的事情:您只需将一个对象的内容移动到另一个对象,但您仍需要在两个不同的内存位置有两个不同的对象来执行分配(好的,那里有自我分配,但我们&# 39; ll忽略那个)。旧对象仍然存在(好吧,它可能是在语句结束时被破坏的临时对象),但是大多数时候你不能保证旧对象,除非它处于某种有效状态。
类比可能是装满家具的房子。移动建筑就像建造一所新房子并将家具移到它上面。移动分配就像购买第二个预先存在的房屋并将家具移动到它。在这两种情况下,新房子都有一个与旧房子不同的地址,但旧房子仍然存在。它可能不是一个有用的状态(很难住在没有家具的房子里!)。
答案 1 :(得分:3)
是。移动构造函数和赋值运算符帮助SomeClass
的新实例获取旧实例状态的所有权,但新实例具有不同的地址。
对您来说,一个考虑因素是您是否希望已移除的SomeClass
实例从SomeManager
“取消注册”,因为它已从等待销毁转移到是否重要取决于您的确切的代码。
答案 2 :(得分:3)
移动构造本质上意味着“这是一个对象X.通过窃取X的内部来创建一个新对象Y.”类似于移动分配。你不移动物体;你移动它的内容。
移动对象X的地址保持不变。其内容可能会改变(例如,变为空),或者可能不会(例如,如果它是移动是副本的原始类型)。
虽然在你描述的方案中你最好确保移动构造函数也注册它创建的对象......