vector内存
Posted Nice vinke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vector内存相关的知识,希望对你有一定的参考价值。
一、vector的内存增长
vector内存的特点:内存空间只会增长,不会减少
vector支持随机访问,vector容器的元素以连续的方式存放,每个元素都紧挨着前一个元素存储。当vector插入数据时,可能空间不够,这时要重新分配新的内存,将数据从旧空间拷贝到新空间,然后释放旧空间,这样性能难以接受,因此每次对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说vector预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配这个容器的空间。当预留空间不够的时候,vector会按一种规律进行重新分配内存:
vs下,vector空间不够时,增加现有空间的一半,原有空间为10,空间不够则增加5,空间大小为15
vc6.0,vector空间不够时,增加一倍,原有5,不够,增加5,为10
二、vector的内存释放
由于vector内存只增不减,如果你先分配了100个字节,然后erase掉后面99个,留下一个有效元素,但是内存仍然是100个字节,所有内存空间是在vector析构时候才能被系统回收。
empty用来检测容器是否为空,clear可以清空所有元素,但是clear后,vector占用的空间不变,无法保证内存的回收
如果想使空间动态的缩小,可以考虑使用deque。
《Effective STL》中的“条款17”:
当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况, 我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需
《Effective STL》给出的解决方案是:
vector<type> v;
//.... 这里添加许多元素给v
//.... 这里删除v中的许多元素
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);
重点:使用swap()来帮助vector释放内存。方法如下:
vector<A>().swap(vec);
或者vec.swap(vector<A>());
三、如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,那么内存就不会被释放。
vector<A*> vec;
vec.push_back(new A());
vec.push_back(new A());
这时,必须要手动释放vec里面的指针指向的内存:
for(vector<A*>::iterator it = vec.begin(); it != end(); ++it)
{
if(NULL !+ *it)
{
delete *it;
*it = NULL;
}
}
vec.clear();
以上是关于vector内存的主要内容,如果未能解决你的问题,请参考以下文章
vectorの奇技淫巧C++ vector 如何正确处理动态申请内存的元素