STL向量:当插入时向量容量增加时,在分配新的连续内存后是否删除或保留旧的连续内存?

时间:2013-08-02 07:11:20

标签: c++ vector

最近在STL :: vector size增加后是否会释放旧内存时会感到困惑。

当插入时stl :: vector容量增加时,会分配一个新的连续内存(= 2 *当前向量容量),并将旧内容复制到新内存。旧的记忆被释放了。

现在最近我们开始讨论,有些人认为旧的内存没有被释放,而是保留供参考。因此,在多个resize上,stl :: vector开始累积不真正需要的内存。

据我所知,它释放了旧记忆,但我没有任何具体的文件。但是我的理解可能是错的!如果有人知道细节,我会很感激,分享一样!

3 个答案:

答案 0 :(得分:8)

vector肯定不会保留记忆。分配器可能或operator new/delete可能。即使操作系统可能会为您的程序保留内存。

答案 1 :(得分:0)

来自N3690

  

23.3.7.5向量修饰符[vector.modifiers]

     

迭代器插入(const_iterator位置,const T& x);

     

迭代器插入(const_iterator位置,T&& x);

     

迭代器插入(const_iterator位置,size_type n,const T& x);

     

模板迭代器插入(const_iterator   position,InputIterator first,InputIterator last);

     

迭代器插入(const_iterator position,initializer_list);

     

template void emplace_back(Args&& ... args);

     

模板迭代器emplace(const_iterator位置,   Args&& ... args);

     

void push_back(const T& x);

     

void push_back(T&& x);

     

1备注:如果新大小大于旧大小,则会导致重新分配   容量。如果没有重新分配,则所有迭代器和引用都会发生   在插入点保持有效之前。如果抛出异常   除了由复制构造函数,移动构造函数,赋值   运算符,或移动T的赋值运算符或任何InputIterator   操作没有效果。如果移动引发异常   非CopyInsertable T的构造函数,效果未指定。

     

2复杂性:元素数量的复杂性是线性的   插入加上向量末尾的距离。

答案 2 :(得分:0)

正如您可能知道的那样,根据标准,重新分配使vector的元素的所有指针和迭代器无效。如果以某种方式保留旧内存,则指针和迭代器将继续有效,因为它们将指向与之前相同的对象。因此,该标准隐含地表示内存会立即释放。

当然,这并不意味着运行时被迫立即消灭该内存。事实上,在您的产品部署到客户的网站之前,它很可能会保持不变。然后它会在他脸上爆炸。