3

我注意到,如果我vec[0] = 1用新鲜的空做std::vector<int>vec.size()仍然存在0

但是,我仍然vec[0]可以检索我的1.

这是在未定义行为的领域吗?这里发生了什么?这是否只是将写入1保留的内存空间,我应该期待这会在我的脸上爆炸,对吧?

4

2 回答 2

8

这确实是未定义的行为

[] 不检查边界也不添加元素。您正在做的是写入和读取使用的缓冲区vector,但这被认为是未定义的行为。


您应该使用其中一种方法添加到向量中。

.push_back(0)默认方法 - 追加到末尾

.resize(num,0)调整vector向上(或向下)的大小num并将新元素的值设置为第二个参数,0。

vector也可以用初始大小构造 -或多或少vector(num,0)v = vector();v.resize(num,0)


另一方面,为了安全地执行此操作,您可以使用.at(n)访问元素,如果您越界访问,这将引发std::out_of_range异常。

于 2013-08-30T05:09:57.373 回答
2

这是在未定义行为的领域吗?

是的。

请记住,C++ 数组的一般规则std::vector是您不能访问您无权访问的元素。新鲜std::vector的大小为0,这意味着它在逻辑上不包含任何元素(为空),因此对于您访问此类不存在的元素是未定义的(谈到进入 void ;)

operator[]ofstd::vector访问向量内的元素,不多也不少。在空向量上做my_vector[0]的正是前一段所说的。您正在访问您无权访问的内容。请注意,这不仅仅是在您修改不存在的元素时。即使只是阅读它也是未定义的。

这里发生了什么?这只是将 1 写入保留的内存空间,我应该期待这会在我的脸上爆炸,对吗?

你真的很幸运,它没有在你的脸上爆炸[1]。:)


[1] 有消息称,这种情况发生的可能性实际上比你想象的要高。因此,您应该小心并练习安全(r)编码。

于 2013-08-30T05:17:36.223 回答