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