【发布时间】:2015-08-12 19:04:50
【问题描述】:
假设我有以下代码:
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 知道,并且一旦超出范围,向量就会被删除?
打印循环会遍历实际向量还是遍历该向量以前所在的陈旧内存区域?
编辑:现在大多数答案都说矢量引用本身应该没问题。我有一段类似于上面的代码,当我修改通过引用接收的向量时导致内存损坏,当我改变方法时停止内存损坏。不过,我不能排除我在更改期间偶然修复了真正的原因。将对此进行实验。
【问题讨论】:
-
迭代器/指针和指向容器 in 数据的引用无效。容器本身并没有移动。如果对容器本身的引用无效,那将毫无价值。
-
关于您的编辑:那段代码是错误的,或者您误解了结果。给出的答案是正确的。
标签: c++ memory vector memory-corruption