• 【转】[STL]vector和deque的内存释放(clear)


    vector的clear成员函数可以清除vector中的元素,使其大小减至0。但它却不能减小vector占用的内存。
    [cpp] view plain copy
    1. int main()  
    2. {  
    3.     vector<int> v(1U<<29);  
    4.     cout<<"step into stage one..."<<endl;  
    5.     sleep(30);  
    6.     v.clear();  
    7.     cout<<"step into stage two..."<<endl;  
    8.     sleep(30);  
    9.     return 0;  
    10. }  

      stage one定义了vector对象,含有2^29个int元素,占用2G内存。stage two调用vector对象的clear成员函数,清除其中所有对象。程序运行过程中,使用ps或者top或者其他工具查看内存占用,会发现,程序在stage one确实占用了大约2GB的内存,但在stage two,程序仍然占用着2G内存。事实上,vector的clear成员只负责对其中每一个元素调用其析构函数,将vector的size置零,并不负责释放vector本身占用的内存空间。

      若想释放vector占用的空间,可以使用swap技巧,

    [cpp] view plain copy
    1. int  
    2. main()  
    3. {  
    4.     vector<int> v(1U<<29);  
    5.     cout<<"step into stage one..."<<endl;  
    6.     sleep(30);  
    7.     vector<int>().swap(v);  
    8.     cout<<"step into stage two..."<<endl;  
    9.     sleep(30);  
    10.     return 0;  
    11. }  

      vector()使用vector的默认构造函数建立临时vector对象,再在该临时对象上调用swap成员,swap调用之后对象v占用的空间就等于一个默认构造的对象的大小(寥寥),临时对象就具有原来对象v的大小,而该临时对象随即就会被析构,从而其占用的空间也被释放。

      并不是所有的STL容器的clear成员的行为都和vector一样。事实上,其他容器的clear成员都会释放其内存。比如另一个和vector类似的顺序容器deque,

     

      观察上面程序的行为,会发现程序在stage two的内存占用也是寥寥的了。

      另外,值得一提的是vector具有reserve成员,会提前为容器预留一定的空间,以防止后的push_back操作导致频繁地重新分配内存和移动元素。然而,据我观察,reserve并没有向系统申请内存。

      关于C++ STL容器的默认内存管理,需参考allocator。
      关于deque的内存模型及其clear操作,我不甚了了,请参考您使用的标准库的代码。
      若想深入了解STL的实现,侯捷大叔的《STL源码剖析》是不错的入门资料,希望能够拜读。
      C++标准中并未对STL的实现细节做过多规定,因此不同实现的细节和表现可能不同。

      C++很复杂,但也并非无底黑洞。学好C++很难,但这种学习过程也会使你收获颇丰。
      学习任何一种技术,都需要热情、激情和足够的耐心。
      做好一件事,需要激情,同时激情常常来源于做好一件事情的满足感。
      满足感会增强人分享的欲望,分享的欲望也常常会使人具有亲和力和感染力,使人觉得你有激情,反过来更有利于人做好一件事。
      blabla, over~

            转自 http://www.dutor.net/index.php/2011/04/vector-deque-clear-reserve/
  • 相关阅读:
    机器学习经典聚类算法 —— k-均值算法(附python实现代码及数据集)
    机器学习经典分类算法 —— k-近邻算法(附python实现代码及数据集)
    linux进程间通信之消息队列
    Linux下的权限掩码umask
    AVL树的插入操作(旋转)图解
    二叉搜索树的插入与删除图解
    MySQL密码忘记之解决方法
    C++之类的构造函数,不得不学明白的重点
    C++编译器的函数名修饰规则
    递归和尾递归的比较,斐波那契
  • 原文地址:https://www.cnblogs.com/luoyinjie/p/7219388.html
Copyright © 2020-2023  润新知