在std :: vector.reserve()之后重新分配std :: vector

时间:2012-05-24 09:54:36

标签: c++ memory-management

我有一段代码,我首先将一些值放入std::vector,然后将其中每个值的地址提供给将要使用它们的对象之一,如下所示:

std::vector < useSomeObject > uso;

// uso is filled

std::vector < someObject > obj;

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
}
for (int i=0; i < numberOfDesiredObjects; ++i){
    uso[i].setSomeObject(&obj[i]);
}

// use objects via uso vector
// deallocate everything

现在,因为我有时候是一个风格怪物,我认为这是丑陋并且只想使用1 for for循环,有点像这样:

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
    uso[i].setSomeObject(&obj.back());
}

当然,我不能这样做,因为偶尔会发生重新分配,并且我设置的所有指针都变得无效。

所以,我的问题是: 我知道如果您知道需要多少并希望提前分配内存,那么std::vector.reserve()就是您的选择。如果我确定我正在尝试使用reserve()提前分配足够的内存,是否可以保证我的指针保持有效?

谢谢。


Sidenote。 This是一个类似的问题,但我想知道的是没有答案。只是为了防止它弹出作为对这个问题的第一个评论。

2 个答案:

答案 0 :(得分:5)

事实上,这是使用reserve的主要原因之一。您 保证追加到std::vector的末尾不会 使向量中的元素的迭代器,引用或指针无效 只要矢量的新大小不超过旧容量。

答案 1 :(得分:4)

  

如果我确保我尝试使用reserve()预先分配足够的内存,这是否可以保证我的指针保持有效?

是的,它保证你的指针保持有效,除非:

  • 尺寸增加超出当前容量
  • 除非,你擦除任何你没有的元素。

迭代器矢量的失效规则在 23.2.4.3/1 &amp;中指定。 23.2.4.3/3 as:

  

插入点之前的所有迭代器和引用都不受影响,除非新容器大小大于先前的容量(在这种情况下,所有迭代器和引用都无效)

     

擦除点后的每个迭代器和引用都无效。