歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ STL中的vector的內存分配與釋放

1.vector的內存增長
 
vector其中一個特點:內存空間只會增長,不會減小,援引C++ Primer:為了支持快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素存儲。設想一下,當vector添加一個元素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣性能難以接受。因此STL實現者在對vector進行內存分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的存儲區,用於存放新添加的元素,這樣就不必為每個新元素重新分配整個容器的內存空間。
 
在調用push_back時,每次執行push_back操作,相當於底層的數組實現要重新分配大小;這種實現體現到vector實現就是每當push_back一個元素,都要重新分配一個大一個元素的存儲,然後將原來的元素拷貝到新的存儲,之後在拷貝push_back的元素,最後要析構原有的vector並釋放原有的內存。

C++ STL next_permutation的實現原理 http://www.linuxidc.com/Linux/2013-04/82498.htm

C++ STL algorithm庫中 next_permutation()用法 注意事項 http://www.linuxidc.com/Linux/2013-04/82497.htm

C++ STL相關容器詳解 http://www.linuxidc.com/Linux/2012-04/58104.htm

C++ STL中元素替換功能的強大函數 http://www.linuxidc.com/Linux/2012-08/69109.htm

Android NDK 調用C++ STL 模板庫(修改android.mk文件)  http://www.linuxidc.com/Linux/2011-08/41947.htm

例如下面程序:

#include <iostream>
#include <cstdlib>
#include <vector>

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<Point> pointVec;
    Point a;
    Point b;
    pointVec.push_back(a);
    pointVec.push_back(b);

    cout<<pointVec.size()<<std::endl;

    return 0;
}


輸出結果:

其中執行
 
pointVec.push_back(a);
此時vector會申請一個內存空間,並調用拷貝構造函數將a放到vector中
 
再調用
 
pointVec.push_back(b);
此時內存不夠 需要擴大內存,重新分配內存 這時再調用拷貝構造函數將a拷貝到新的內存,再將b拷入新的內存,同時有人調用Point拷貝構造函數,最後釋放原來的內存 此時調用Point的析構函數。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/102381p2.htm

Copyright © Linux教程網 All Rights Reserved