vector等数据结构内存分配策略
正文
vector是一个动态数组,它会根据元素的个数,适当的去申请内存。可以简单的把vector理解为,其内部有一个 void* 的指针,用于指向在堆上面申请的空间。 void* 指向的空间用于存放vector元素。vector一直维护者void* 空间的大小,当void 指向的堆空间没有空间存放新插入的元素时,它都会去系统申请之前空间大小的两倍空间,并把之前的元素全部拷贝到新的空间,释放掉原空间,在新空间中插入新的元素。*
实际上包括map、set等数据结构的内存分配策略都是如此
减少vector内存占用
在vecotr的内存分配策略中,内存占用的空间是只增不减的,比如首先分配了10000个字节大小的空间,然后erase掉后面的9999个,留下一个有效元素,但是内存占用仍为10000个。所有的内存空间是在vector析构的时候才能被系统回收。empty()方法只能用来检测容器是否为空,clear()可以清空所有元素,但容器所占用的空间依然如故,无法保证内存的回收。
如果需要空间动态缩小,可以考虑使用deque。真正能够释放内存的函数是swap()。具体方法如下:
vector<Poing>().swap(poingVec); // 或者pointVec.swap(vector<Point>())
使用模板:
template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}
原理:swap()是交换函数,调用时会使vector离开其自身的作用域,从而强制释放vector所占的内存空间,总而言之,释放vector内存最简单的方法是vector
如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,内存也不会被释放。