【问题标题】:vector::reserve and built-in types [duplicate]vector::reserve 和内置类型
【发布时间】:2015-11-09 10:24:28
【问题描述】:

请不要在未完整阅读之前将其标记为重复。这不是一个“std::reserve 做什么”的问题。

使用内置类型写入 vector::reserve 的地址会出错吗?

vector<int> vec;
vec.reserve(10);
vec[5] = 24; // Is this an error?

我知道对象没有被初始化,但由于它们只是 整数 并且空间是通过保留分配的,并且这是在 连续存储 中完成的,这是一个错误吗?全部?

【问题讨论】:

  • 这实际上是“std::reserve 做了什么”。如果你明白这一点,你就不会问这个问题了。
  • @juanchopanza 我不在乎反对票。特别是因为那里的答案被赞成和错误 - 这意味着人们没有明确这个概念,因此这是一个完全有效的问题。我找不到能准确回答我的问题的副本。
  • IMO 这是一个完全合理的问题。我相信投反对票的人并没有真正理解它。
  • @sbabbi 是合法的,之前有人问过。包括之前的 OP。

标签: c++ vector


【解决方案1】:

根据标准,这是一个错误,因为它是未定义的行为。这可能不会导致任何可观察到的问题,但它仍然是一个错误。一些实现会在调试模式下进行边界检查并抛出异常。他们可以这样做,而且这样做完全符合标准,因为您调用了未定义的行为。

【讨论】:

  • 这是有道理的。毕竟大小没有改变。
【解决方案2】:

是的,这是一个错误。

这也是vector::reservevector::resize的区别。正如你所说,它必须与向量元素被统一化。

两者的区别参考thisso上的优秀线程。

【讨论】:

  • “对象”是指向量本身,对吗?
  • 是的,向量没有初始化。即使它是,但当前大小为 5,保留空间为 20,执行 vec[10] 会出错。
  • @therainmaker:不,向量不是未初始化,元素是。
  • @BenjaminLindley:很好的区别。从来没有真正这么想过。编辑它。
  • @therainmaker:即使有这个警告,它也没有真正进入重点,因为我们在这里讨论的是 POD 类型。分配给 POD 类型相当于初始化它们。因此,如果唯一的问题是 reserve 没有初始化元素,那么 OP 所做的对于 POD 类型的向量(如 int)来说不会是错误。
猜你喜欢
  • 1970-01-01
  • 2011-11-15
  • 2020-09-22
  • 2013-06-18
  • 2010-12-17
相关资源
最近更新 更多