C ++返回vector.at()地址更改

时间:2018-02-07 20:21:26

标签: c++ vector

为什么元素的地址是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)始终正确。这里有一个我不明白的微妙之处。

2 个答案:

答案 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()的基础数据。新阵列的地址与其替换的地址不同。