C++11:执行移动操作以更改地址
C++11: Does a move operation change the address?
假设我有一个主类SomeManager
,用于跟踪另一个类SomeClass
的实例。当构造SomeClass
时,它调用SomeManager
的方法,将指针传递给它自己。然后SomeManager
获取该指针并将其推送到向量中。SomeClass
的析构函数调用SomeManager
的另一个函数,该函数将其指针从向量中移除。
所以,我的问题是,当SomeClass
的实例通过move运算符或构造函数移动时。地址变了吗?我必须删除旧地址并添加新地址吗?
从我读到的内容来看,我对此有一些想法,但我不确定,我不想把事情搞砸。
简短回答:不,从对象移动的地址不会改变。但旧物体可能不是一个有用的状态。
执行移动构造时,您正在创建一个新对象,并将另一个对象的内容移动到新对象中。新对象将始终构建在与旧对象不同的内存位置。移动分配也会发生类似的情况:你只需将一个对象的内容移动到另一个对象,但你仍然必须在两个不同的内存位置有两个不同对象才能执行分配(好吧,有自分配,但我们将忽略这一点)。旧对象仍然存在(好吧,它可能是一个在语句结束时被销毁的临时对象),但大多数时候,除了它处于某种有效状态之外,您对旧对象没有任何保证。
一个类比可以是一个装满家具的房子。搬迁施工就像建造一栋新房子并将家具搬到它上面。搬迁任务就像<em]购买第二栋先前存在的房子>
是。move构造函数和赋值运算符帮助SomeClass
的新实例拥有旧实例的状态,但新实例有一个不同的地址。
您需要考虑的一个问题是,您是否希望从SomeClass
中删除的实例在从SomeManager
移动时"取消注册"自己,而不是等待销毁——这是否重要取决于您的确切代码。
Move构造本质上意味着"这是一个对象X。通过窃取X的内部来创建一个新对象Y。"类似于Move赋值。你不会移动物体;你移动它的内容。
从中移动的对象X的地址保持不变。它的内容可能会改变(例如,变为空),也可能不会(例如,如果它是一个移动是副本的基元类型)。
尽管在您描述的方案中,您最好确保move构造函数也注册它创建的对象。。。
- 将数组的地址分配给变量并删除
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 对字符串进行位操作
- 将地址分配给本地指针后,公共对象的变量将消失
- 如何在 c++ 中操作当前对象的地址?
- INC 操作码编译到错误的地址
- PIN从指令地址获取程序集操作码
- 指针地址交换总是C++中的原子操作吗
- C++11:执行移动操作以更改地址
- 取消引用指针以操作地址的内容
- 当定义一个将在内存上操作的函数时,将地址传递为void*或uint8*是否更正确?
- 如何操作在随机地址使用指针
- 操作系统——c++被设计成在单个地址空间内操作