为什么元素的地址是ping-pong?
我有这样的事情:
std::vector<double> foo(...);
int main(){
std::vector<double> x;
x.assign(1,0.0);
x = foo(...);
print &x.at(0); // 0x607210
x = foo(...);
print &x.at(0); // 0x607240
x = foo(...);
print &x.at(0); // 0x607210
}
为什么元素的地址是乒乓球? x
的基地址保持不变,值x.at(0)
始终正确。这里有一个我不明白的微妙之处。
答案 0 :(得分:2)
foo
函数返回一个新向量。由于结果是r值,因此将其移动分配给x
。由于每个新向量都有不同的缓冲区,因此x
的缓冲区在每个移动赋值后也是不同的。
缓冲区不能与另一个现有缓冲区共享其地址,并且返回的r值和x
都有重叠的生命周期,因此缓冲区地址必须更改。但是一个独特的缓冲区可以有一个先前被破坏的缓冲区的地址,这就是为什么你观察到的重复是可能的。
答案 1 :(得分:0)
x=foo()
正在为std::vector<double>
分配x
。根据{{3}},operator=
总是使指针,引用和迭代器无效。预计元素的地址会发生变化。这些地址&#34;乒乓球&#34;只是你偶然发现的行为。它不是可以依赖的东西。
考虑在这种情况下分配给std::vector
的含义。移动赋值运算符将x
的基础数据替换为std::vector
返回的foo()
的基础数据。新阵列的地址与其替换的地址不同。