C++ 11:移动操作是否改变了地址?

San*_*lin 6 c++ pointers memory-address move-semantics c++11

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

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

我从我读过的内容中得到了一些想法,但我不确定,我不想搞砸.

Chr*_*den 20

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

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

类比可以是装满家具的房子.移动建筑就像建造一所新房子并将家具搬到它上面.移动任务就像购买第二个预先存在的房屋并将家具移动到它.在这两种情况下,新房子都有一个与旧房子不同的地址,但旧房子仍然存在.它可能不是一个有用的状态(很难住在没有家具的房子里!).

  • 所有发布的答案似乎都是正确的,但房屋可视化让我感到高兴. (6认同)
  • 应该推广这个类比C++书籍作者. (3认同)