最近在增加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复杂性:复杂性在元素数量上是线性的插入的值加上到矢量末端的距离。