STL----vector的内存分配与释放

参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html

案例

#include 
#include 
#include 

using namespace std;

class Point
{
public:
        Point()
        {
            cout << "construction" << endl;
        }
        Point(const Point& p)
        {
            cout << "copy construction" << endl;
        }
        ~Point()
        {
            cout << "destruction" << endl;
        }
};

int main()
{
    vector pointVec;
    Point a;
    Point b;
    pointVec.push_back(a);
    pointVec.push_back(b);

    cout<
STL----vector的内存分配与释放_第1张图片

===================

分析:

        vector pointVec;      定义了一个vector容器,元素类型为Point对象,初始化容器大小为0,无元素


         Point a;  
         Point b;                         定义了两个Point对象,对应输出结果的前两行:construction


         pointVec.push_back(a); 

                                               将a对象push_back到容器里,Point的拷贝构造函数被调用(因为容器里添加的是原始数据(Point a)的一份copy);

                                               此时size为1,capacity为1
                                               对应输出结果:copy construction 


         pointVec.push_back(b); 

                                              将b对象push_back到容器,但此时的pointVec并无可用空间(capacity - size = 0),

                                              此时引发内存重新分配,而vector的机制是当前分配的是前一次的两倍,所以它会重新开辟一个空间(capacity=2),

                                              并将之前空间里的a对象拷贝构造到新的空间,接着继续构造对象b,最后销毁之前pointVec占用的空间。此时size为2,capacity为2
                                              对应输出结果:

                                                        copy construction
                                                        copy construction
                                                        destruction


         cout<


        最后,main函数退出,pointVec依次调用Point b,Point a的析构函数,

        然后最前面定义的pointVec的析构函数也会被调用(依次调用各元素的析构函数),

        导致后面4条:destruction的输出语句


思考:当我们再pointVec.push_back(c),此时也会导致vector重分配,此时capacity为,4,size为3

  • vector的内存释放

       由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。
如果需要空间动态缩小,可以考虑使用deque。如果vector,可以用swap()来帮助你释放内存。具体方法如下:


       vector().swap(pointVec); //或者pointVec.swap(vector ())



ps:vector源码的一些知识

STL----vector的内存分配与释放_第2张图片

你可能感兴趣的:(STL,C++)