【发布时间】:2016-04-11 00:31:41
【问题描述】:
我正在阅读这篇文章:What are move semantics?
请注意,该帖子中针对移动构造函数给出的示例是:
string(string&& that)
{
data = that.data;
that.data = nullptr;
}
当我们使用string a(x+y) 构造一个新字符串时,我发现它很混乱。由于x+y 的结果是一个临时变量,它很快就会被销毁。这意味着复制指针 (data = that.data) 确实会复制一个悬空指针,在原始数据(应该存储在函数调用完成后被清理的x+y 的堆栈帧中)被销毁之后.似乎将 that.data 设置为 nullptr 无济于事,因为无论如何都会清理堆栈帧。
谁能解释为什么这不是问题?而c++实际上是如何处理这种情况的?
【问题讨论】:
-
移动一个对象通常会改变目标和源对象(目标窃取数据而让源一无所有——也许是数据交换)
-
x+y创建一个临时字符串,其中包含指向包含相关数据的堆内存的指针data。如果临时超出范围,它在堆上拥有的内存将被删除。但是您引用的移动构造函数会以一种不再拥有该内存的方式更改临时对象-因此它将超出范围而不会实际触及其内容。相反,新创建的a现在拥有该内存(其data指向数据,最初由x+y拥有)。
标签: c++ move-semantics move-constructor