【问题标题】:Why is vector.reserve(2) followed by v[0] = 2 considered incorrect?为什么 vector.reserve(2) 后跟 v[0] = 2 被认为不正确?
【发布时间】:2012-11-10 09:29:00
【问题描述】:

所以据我了解,reserve 不会初始化抽象,而只是分配空间以包含它们。但是,v[0] 不应该总是给你第一个未初始化的内存,并且不应该总是给它赋值吗?

【问题讨论】:

标签: c++ memory stl vector


【解决方案1】:

因为reserve 不会改变向量的大小。它只会将向量移动到内存中足够空间允许向量大小在必要时增加的位置。

如果你想确保你可以调用v[0]=2,甚至v[1]=0,你应该使用resize(2),而不是reserve(2)

【讨论】:

    【解决方案2】:

    因为它会调用未定义的行为。库编写者可以合法地将 begin() 的地址保留为 nullptr,直到您调整大小。或将其设置为 0xBAADFOOD。或者在写入时格式化您的硬盘。

    现在,更有可能发生的是,这是未初始化的内存。所以没有什么可怕的事情发生,除了调试中的一堆断言,以及向量关于它的状态而无法修复它的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-15
      • 2021-10-10
      • 2019-01-08
      • 1970-01-01
      • 2016-05-02
      • 2019-08-09
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多