2

最近对增加 STL::vector 大小后是否会释放旧内存感到困惑。

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

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

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

4

3 回答 3

8

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

于 2013-08-02T07:13:03.057 回答
0

N3690

23.3.7.5 矢量修饰符[vector.modifiers]

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

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

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

模板迭代器插入(const_iterator 位置,首先是 InputIterator,最后是 InputIterator);

迭代器插入(常量迭代器位置,初始化器列表);

模板无效 emplace_back(Args&&... args);

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

无效 push_back(const T& x);

无效 push_back(T&& x);

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

2 复杂度:复杂度与插入的元素数量加上到向量末端的距离成线性关系。

于 2013-08-02T07:41:53.570 回答
0

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

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

于 2013-08-02T07:54:11.500 回答