最近在STL :: vector size增加后是否会释放旧内存时会感到困惑。
当插入时stl :: vector容量增加时,会分配一个新的连续内存(= 2 *当前向量容量),并将旧内容复制到新内存。旧的记忆被释放了。
现在最近我们开始讨论,有些人认为旧的内存没有被释放,而是保留供参考。因此,在多个resize上,stl :: vector开始累积不真正需要的内存。
据我所知,它释放了旧记忆,但我没有任何具体的文件。但是我的理解可能是错的!如果有人知道细节,我会很感激,分享一样!
答案 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
的元素的所有指针和迭代器无效。如果以某种方式保留旧内存,则指针和迭代器将继续有效,因为它们将指向与之前相同的对象。因此,该标准隐含地表示内存会立即释放。
当然,这并不意味着运行时被迫立即消灭该内存。事实上,在您的产品部署到客户的网站之前,它很可能会保持不变。然后它会在他脸上爆炸。