我注意到,如果我vec[0] = 1
新空std::vector<int>
,vec.size()
仍为0
。
然而,我仍然可以vec[0]
来检索我的1
。
这是否属于未定义的行为?这里发生了什么?这只是简单地将1
写入保留的内存空间,我应该期待这会在我脸上爆炸,对吗?
答案 0 :(得分:8)
确实是未定义的行为
[]
不检查边界而不添加元素。你正在做的是写入和读取vector
使用的缓冲区,但这被认为是未定义的行为。
您应该使用其中一种方法添加到矢量。
.push_back(0)
默认方法 - 附加到结尾
.resize(num,0)
将vector
向上(或向下)调整为num
,并将新元素的值设置为第二个arg,0。
vector
也可以使用初始尺寸构建 - vector(num,0)
与v = vector();v.resize(num,0)
或多或少相同
另一方面,为了安全地执行此操作,您可以使用.at(n)
来访问元素,如果超出边界,这将引发std::out_of_range异常。
答案 1 :(得分:2)
这是否属于未定义的行为?
是
请记住,C ++数组和std::vector
的一般规则是您无法访问您无权访问的元素。一个新的std::vector
的大小为0
,这意味着它在逻辑上不包含任何元素(为空),因此您访问这些不存在的元素时未定义(谈到达到void { {1}})
;)
只operator[]
访问元素中的元素,不多也不少。对空向量执行std::vector
会完全按照前一段所述进行操作。您正在访问您无权访问的内容。请注意,这不仅仅是在修改不存在的元素时。即使只是阅读它也是未定义的。
这里发生了什么?这只是简单地将1写入保留的存储空间,我应该期待这会在我脸上爆炸,对吗?
你真的很幸运,它并没有在你脸上爆炸 [1] 。 :)
[1] 有消息称,发生这种情况的可能性实际上高于您的想法。因此,您应该注意并练习安全(r)编码。