为什么以下工作?我认为写入矢量对象超出矢量对象末尾的索引会导致分段错误。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> x(1);
x[10] = 1;
cout << x[10] << endl;
}
这有什么影响?是否有一种更安全的方法来初始化n个元素的向量并只写入那些元素?我应该总是使用push_back()
吗?
答案 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()来查找容器的当前大小。