STL:如何釋放vector佔用的內存

(一道百度面試題)

C++ STL中vector的相關問題,調用clear時,內部是如何具體實現的?若想將其內存釋放,該如何操作?

假設我們先定義一個容器x:vector<int> x(100);

這樣首先會申請(100*sizeof(int))的內存大小。調用clear函數僅僅是將數據清除,而申請的內存還是存在的,並沒有釋放掉。可以調用下面的語句進行釋放:

{
    vector<int> t;
    t.swap(x);
}

解釋如下:

vector自己本身並沒有直接去申請內存,而是通過STL中的內存管理器allocator去申請。在vector中有如下幾個相關的屬性成員:

iterator start;//iterator表示指向數據的指針類型,這個例子裏面可以理解爲int *;start指向申請的內存起始點
iterator finish;//指向下一個放數據的位置;
iterator end_of_storage;//指向申請的內存結束點
typedef simple_alloc<value_type, Alloc> data_allocator;
//內存管理器,其中Alloc 是模板參數(vector類模板前面的template <class T, class Alloc = alloc>),其默認值是次級分配器alloc.關於STL內存分配器,可參考"http://hi.baidu.com/lovers_space/item/c68fac1c3ed696a888a956f0"


在vector的構造函數中會通過data_allocator申請內存,在析構函數中會通過它釋放內存.

vector的成員函數swap的實現如下:

void swap(vector<T, Alloc>& x){
   __STD::swap(start, x.start);
   __STD::swap(finish, x.finish);
   __STD::swap(end_of_storage, x.end_of_storage);
}

可以看出這個函數將兩個vector的三個指針指向的內存位置交換了。

因爲vector的默認函數定義爲

vector() : start(0), finish(0), end_of_storage(0) {}

所以在這個例子中,我們通過vector<int>t;創建了一個start=finish=end_of_storage=0的vector,然後交換x和t的這三個指針。注意我們用大花括號將這個過程括起來了,當程序跑出大花括號的作用範圍時,t將被銷燬,銷燬之前調用析構函數

~vector() {
    destroy(start, finish);//這個會將start-finish之間的對象銷燬
     deallocate();//銷燬之後釋放內存
}

void deallocate() {
    if (start) data_allocator::deallocate(start, end_of_storage - start); 
}

可以看到最終調用內存管理器中的釋放函數將start開始的(end_of_storage-start)個size的內存空間釋放掉了。通過銷燬t,最終達到釋放x中申請內存的目的。

 

發佈了13 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章