關於vector容器的內存釋放

以前使用vector容器一直有個誤區=。=,然後最近面試被鄙視了QWQ


先說一下vector容器的簡單原理:

  對於vector容器而言,數據結構就是數組,在STL中我有剖析源碼。其中實現的是相當於數組的方面,然後其中對於容器的操作函數都有:

 


在這之中。插入操作我們就暫且不提。就是數組的數據插入。

現在說一下關於vector容器中的空間設置

 vector中有2個大小指標,一個是size:代表當前數據的大小

            另外一個是capacity.代表着當前vector所申請的空間大小


下面提一下空間配置器。對於STL所有的容器而言,都是使用STL內部實現的alloc(內存池)進行空間的申請。vector是一個靜態的空間,也就是我們申請以後就無法進行修改了。


以前我很蠢的直接調用clear然後就清除數據就ok了,然後空間隨着作用域進行釋放。。


結果這樣會有很大的內存浪費。。


所以解決方法是這樣

//加一對大括號是可以讓tmp退出{}的時候自動析構{ 
    std::vector<int> tmp =   nums;  
    nums.swap(tmp); 
}

通過swap函數進行空間轉換,然後就出去作用域vector就進行了釋放。


在標準一點是這樣的:

template < class T >void ClearVector( vector< T >& vt ) 
{
    vector< T > vtTemp; 
    veTemp.swap( vt );
}


就是通過作用域還有swqp的搭配進行空間的釋放,然後就OK了


下面提一個小問題:

如果vector中存放的是指針,那麼當vector銷燬時,這些指針指向的對象不會被銷燬,那麼內存就不會被釋放。如下面這種情況,vector中的元素時由new操作動態申請出來的對象指針:

for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) 
    if (NULL != *it) 
    {
        delete *it; 
        *it = NULL;
    }
v.clear();

當時很sb的就回答成這種情況了,面壁面壁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章