c++ - 超过 vector 不会导致段错误

标签 c++ vector segmentation-fault

我对这段代码的结果很疑惑:

std::vector<int> v;
std::cout << (v.end() - v.begin()) << std::endl;
v.reserve(1);
std::cout << (v.end() - v.begin()) << std::endl;
v[9] = 0;
std::cout << (v.end() - v.begin()) << std::endl;

输出:

0
0
0

所以...首先...end() 不指向内部数组的末尾而是最后占用的单元格...好的,这就是为什么结果在 reserve(1) 之后,迭代器减法仍然是 0。但是,为什么填满一个单元格后还是0。我期望 1 作为结果,因为 end() 现在应该将迭代器返回到第二个内部数组单元格。 此外,为什么我在使用 v[9] = 0 访问第 10 个单元时没有出现段错误,而 vector 只有 1 个单元长?

最佳答案

首先,end()为您提供一个指向 vector 中最后一个元素之后的迭代器。如果 vector 为空,则 begin()除了与 end() 相同之外,不能返回任何其他内容。

然后当你调用reserve()您实际上并没有创建任何元素,您只是保留了一些内存,因此当您添加元素时 vector 不必重新分配。

最后,当你这样做的时候

v[9] = 0;

您正在索引 vector 越界,这会导致未定义的行为,因为您写入不属于您的内存。 UB 经常会导致崩溃,但实际上并没有,它可能似乎有效,但实际上并没有。

作为最后一部分的注释,the [] operator没有边界检查,这就是为什么它会接受超出范围的索引。如果你想要边界检查,你应该使用 at() .

关于c++ - 超过 vector 不会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856925/

相关文章:

r - 如何根据引用向量找到元素的位置(索引)?

python-3.x - 导入 opencv 时出现 Python3 重新链接问题

c++ - SFML Sprite std::list

c++ - 使用 for 循环删除 vector 中的元素

c++ - vector 上的 push_back 调用导致的段错误(线程 linux)

c++ - 将派生对象存储在基本类型的 vector 中

c++ - 我想告诉 VC++ 编译器编译所有代码。可以吗?

c++ - 函数返回的字符串文字的生命周期

c++ - 如何评估交换机中的QChar对象?

python - 如何从 tensorflow 中的常量创建向量