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

STL vector: When vector capacity is increased due to insert, does the old contiguous memory deleted or kept after allocating new contiguous memory?

本文关键字:连续 内存 矢量 是否 删除 保留 分配 插入 容量 增加 STL      更新时间:2023-10-16

最近在增加STL::向量大小后是否会释放旧内存的问题上陷入了困惑。

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

现在,最近我们开始讨论,有些人认为旧记忆并没有被释放,而是被保存起来以供参考。因此,通过多次调整大小,stl::vector开始积累内存,而这并不是真正需要的。

据我所知,它解放了旧记忆,但我没有任何具体的文档。然而,我的理解可能是错误的!如果任何知道细节的人都能分享,我将不胜感激!

vector肯定不会保留内存。分配器可能,或者operator new/delete可能。甚至操作系统也可能保留为程序保留的内存。

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

当然,这并不意味着运行时必须立即清除内存。事实上,在您的产品部署到客户的站点之前,它很可能会保持原样。然后它会在他的脸上爆炸。

来自N3690

23.3.7.5矢量修改器【矢量修改器】

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

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

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

模板迭代器插入(const_iteratorposition,InputIterator first,InputItator last);

迭代器插入(const_iterator位置,initializer_list);

template void template_back(Args&&…Args);

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

void push_back(常量T&x);

void push_back(T&&x);

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

2复杂性:复杂性在元素数量上是线性的插入的值加上到矢量末端的距离。