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().swap(pointVec)。如果pointVec 是一个类的成员,此时不能把 vector().swap(pointVec)写进类的析构函数中,否则会导致double free or corruption(fasttop) 的错误,原因是可能会重复释放内存。当然也有可能用g++编译时直接报错。

如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,内存也不会被释放。


标题:vector等数据结构内存分配策略
作者:staymeloo7
联系方式:staycoolsun@gmail.com

    评论
    0 评论
avatar

取消