STL 如何釋放vector占用的記憶體

2021-06-18 10:18:41 字數 1095 閱讀 4347

c++ stl中vector的相關問題,呼叫clear時,內部是如何具體實現的?若想將其記憶體釋放,該如何操作?

假設我們先定義乙個容器x:vectorx(100);

這樣首先會申請(100*sizeof(int))的記憶體大小。呼叫clear函式僅僅是將資料清除,而申請的記憶體還是存在的,並沒有釋放掉。可以呼叫下面的語句進行釋放:

解釋如下:

iterator start;//iterator表示指向資料的指標型別,這個例子裡面可以理解為int *;start指向申請的記憶體起始點

iterator finish;//指向下乙個放資料的位置;

iterator end_of_storage;//指向申請的記憶體結束點

typedef ******_allocdata_allocator;

//記憶體管理器,其中alloc 是模板引數(vector類模板前面的template ),其預設值是次級分配器alloc.關於stl記憶體分配器,可參考""

在vector的建構函式中會通過data_allocator申請記憶體,在析構函式中會通過它釋放記憶體.

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

void swap(vector& x)
可以看出這個函式將兩個vector的三個指標指向的記憶體位置交換了。

因為vector的預設函式定義為

vector() : start(0), finish(0), end_of_storage(0) {}
所以在這個例子中,我們通過vectort;建立了乙個start=finish=end_of_storage=0的vector,然後交換x和t的這三個指標。注意我們用大花括號將這個過程括起來了,當程式跑出大花括號的作用範圍時,t將被銷毀,銷毀之前呼叫析構函式

~vector() 

void deallocate()

可以看到最終呼叫記憶體管理器中的釋放函式將start開始的(end_of_storage-start)個size的記憶體空間釋放掉了。通過銷毀t,最終達到釋放x中申請記憶體的目的。

STL中Vector的記憶體釋放問題

vector是stl中最常見的模板之一,其記憶體是連續的。vector的大小有size和capacity之別,記憶體可以動態增長。vector呼叫clear 之後,只會把size設定為0,而記憶體空間並沒有釋放。vector 中的內建有記憶體管理,當 vector 離開它的生存期的時候,它的析構函式...

埠被占用,如何釋放埠

專案啟動時經常見到埠被占用的情況,這時有兩個方案 一是改專案配置檔案的埠 二是釋放這個被占用的埠。我們這裡看第二種,釋放被占用的埠需要兩個命令 netstat ano findstr 被占用埠號 taskkill t f im 被占用埠號對應的tcp號 具體步驟如下 1 開啟cmd 命令視窗,輸入n...

vector記憶體釋放

centroidbinary.swap vector 前面的是vector 由於vector的記憶體占用空間只增不減,比如你首先分配了10,000個位元組,然後erase掉後面9,999個,留下乙個有效元素,但是記憶體占用仍為10,000個。所有記憶體空間是在vector析構時候才能被系統 empt...