我注意到,如果我vec[0] = 1
用新鲜的空做std::vector<int>
,vec.size()
仍然存在0
。
但是,我仍然vec[0]
可以检索我的1
.
这是在未定义行为的领域吗?这里发生了什么?这是否只是将写入1
保留的内存空间,我应该期待这会在我的脸上爆炸,对吧?
这确实是未定义的行为
[]
不检查边界也不添加元素。您正在做的是写入和读取使用的缓冲区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异常。
这是在未定义行为的领域吗?
是的。
请记住,C++ 数组的一般规则std::vector
是您不能访问您无权访问的元素。新鲜std::vector
的大小为0
,这意味着它在逻辑上不包含任何元素(为空),因此对于您访问此类不存在的元素是未定义的(谈到进入 void ;)
)
operator[]
ofstd::vector
只访问向量内的元素,不多也不少。在空向量上做my_vector[0]
的正是前一段所说的。您正在访问您无权访问的内容。请注意,这不仅仅是在您修改不存在的元素时。即使只是阅读它也是未定义的。
这里发生了什么?这只是将 1 写入保留的内存空间,我应该期待这会在我的脸上爆炸,对吗?
你真的很幸运,它没有在你的脸上爆炸[1]。:)
[1] 有消息称,这种情况发生的可能性实际上比你想象的要高。因此,您应该小心并练习安全(r)编码。