写入vector <int>的索引超出容器的末尾</int>

时间:2015-04-10 01:52:49

标签: c++ vector

为什么以下工作?我认为写入矢量对象超出矢量对象末尾的索引会导致分段错误。

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> x(1);
  x[10] = 1;
  cout << x[10] << endl;
}

这有什么影响?是否有一种更安全的方法来初始化n个元素的向量并只写入那些元素?我应该总是使用push_back()吗?

2 个答案:

答案 0 :(得分:2)

实施std::vector的人可能很容易决定给它最小大小10或20个元素左右,理论上内存管理器可能有足够大的最小分配大小,它将使用(约)相反,相同数量的记忆。

就避免读/写结束而言,一种可能性是尽可能避免使用索引,并在真正无法避免索引时使用.at()进行索引。

我发现通常可以通过对大多数任务使用基于范围的for循环和/或标准算法来避免进行索引编制。对于一个简单的例子,考虑这样的事情:

int main() {
    vector<int> x(1);
    x.push_back(1);

    for (auto i : x)
        cout << i << "\n";
}

.at()确实有效,但我很少发现它有用或必要 - 我怀疑平均每年使用它不到一次。

答案 1 :(得分:1)

因此,当您尝试寻址数组的元素或容器外部的向量时,实际发生的事情是对不属于容器的一块内存的内存解除引用。但是,对此位置的读写操作可以“正常工作”。或似乎工作,因为它只是你正在读/写的更多内存。你做的事非常糟糕。在访问边界之外的内存时,您通常会看到随机垃圾,因为它可能属于其他内容,或者是前一个进程中的剩余内存,因为内存控制器不会自然地将内存清零。因此,最好的做法是使用容器的大小来检查您的读写,如果您对容器的范围之外是否有疑问。您可以使用vector.size()来查找容器的当前大小。