修改矢量参考。哪些内容失效?

时间:2015-08-12 19:04:51

标签: c++ memory vector memory-corruption

假设我有以下代码:

void appendRandomNumbers(vector<double> &result) {
    for (int i = 0; i < 10000; i++) {
        result.push_back(rand());
    }
}

vector<double> randomlist;
appendRandomNumbers(randomlist);
for (double i : randomlist) cout << i << endl;

重复的push_back()操作最终会导致重新分配,我怀疑内存损坏。 实际上,vector.push_back() documentation表示

  

如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将失效。

重新分配后,哪个范围会有正确的向量? appendRandomNumbers使用的引用是否无效,因此它将数字推送到它不应该的位置,或仅仅通过appendRandomNumbers知道“正确”位置,并且一旦超出范围就删除该向量?

打印循环是否会迭代实际向量或过去以前存在的内存陈旧区域?

编辑:现在大多数答案都说矢量参考本身应该没问题。我有一段类似于上面的代码,当我修改了一个通过引用接收的向量并且在我改变方法时停止了内存损坏时导致内存损坏。尽管如此,我不能排除我在变化期间偶然修复了真正的原因。将对此进行试验。

3 个答案:

答案 0 :(得分:1)

我认为你对发生的事感到困惑。 create可以使指向向量中的对象的迭代器和引用无效,而不是向量本身。在你的情况下,没有失效,你的代码是正确的。

答案 1 :(得分:0)

引用vector<double> &result没问题,问题是如果您有引用底层内存的内容,例如

double& some_value = result[74];
result.push_back();   // assume this caused a reallocation

现在some_value引用了不良内存,使用data

访问基础数组会发生同样的情况
double* values = result.data();
result.push_back();  // again assume caused reallocation

现在values指向垃圾。

答案 2 :(得分:0)

我认为你对失效的内容感到困惑。您示例中的所有内容都是完美的代码。问题是当您保留对向量本身拥有的数据的引用时。例如:

vector<double> v;
v.push_back(x);
double& first = v[0];
v.push_back(y);
v.push_back(z);
v.push_back(w);
cout << first;

此处,first是对v内部数据的引用 - 可能被其中一个push_back()无效,除非您特别说明对于额外的大小,您应该假设它 无效,因此cout是未定义的行为,因为first是一个悬空引用。这是你应该担心的事情 - 不是你通过引用传递整个vector本身的情况。