gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:48:06 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com