C STL中的vector的記憶體分配與釋放

2021-07-23 14:14:51 字數 2129 閱讀 9450

1.vector的記憶體增長

vector其中乙個特點:記憶體空間只會增長,不會減小,援引c++ primer:為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣效能難以接受。因此stl實現者在對vector進行記憶體分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的儲存區,用於存放新新增的元素,這樣就不必為每個新元素重新分配整個容器的記憶體空間。

在呼叫push_back時,每次執行push_back操作,相當於底層的陣列實現要重新分配大小;這種實現體現到vector實現就是每當push_back乙個元素,都要重新分配乙個大乙個元素的儲存,然後將原來的元素拷貝到新的儲存,之後在拷貝push_back的元素,最後要析構原有的vector並釋放原有的記憶體。例如下面程式:

#include #include 

#include

using

namespace

std;

class

point

point(

const point&p)

~point()

};int

main()

輸出結果:

其中執行

pointvec.push_back(a);
此時vector會申請乙個記憶體空間,並呼叫拷貝建構函式將a放到vector中

再呼叫

pointvec.push_back(b);
此時記憶體不夠 需要擴大記憶體,重新分配記憶體 這時再呼叫拷貝建構函式將a拷貝到新的記憶體,再將b拷入新的記憶體,同時有人呼叫point拷貝建構函式,最後釋放原來的記憶體 此時呼叫point的析構函式。

2.vector的記憶體釋放

由於vector的記憶體占用空間只增不減,比如你首先分配了10,000個位元組,然後erase掉後面9,999個,留下乙個有效元素,但是記憶體占用仍為10,000個。所有記憶體空間是在vector析構時候才能被系統**。empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的記憶體空間依然如故,無法保證記憶體的**。

如果需要空間動態縮小,可以考慮使用deque。如果vector,可以用swap()來幫助你釋放記憶體。具體方法如下:

vector().swap(pointvec); //

或者pointvec.swap(vector())

標準模板:

template < class t >

void clearvector( vector< t >&vt )

swap()是交換函式,使vector離開其自身的作用域,從而強制釋放vector所佔的記憶體空間,總而言之,釋放vector記憶體最簡單的方法是vector().swap(pointvec)。當時如果pointvec是乙個類的成員,不能把vector().swap(pointvec)寫進類的析構函式中,否則會導致double free or corruption (fasttop)的錯誤,原因可能是重複釋放記憶體。(前面的pointvec.swap(vector())用g++編譯沒有通過)

3.其他情況釋放記憶體

如果vector中存放的是指標,那麼當vector銷毀時,這些指標指向的物件不會被銷毀,那麼記憶體就不會被釋放。如下面這種情況,vector中的元素時由new操作動態申請出來的物件指標:

#include using

namespace

std;

vector

v;

每次new之後呼叫v.push_back()該指標,在程式退出或者根據需要,用以下**進行記憶體的釋放:

for (vector::iterator it = v.begin(); it != v.end(); it ++) 

if (null != *it)

v.clear();

分類: 

c/c++

C STL中的vector的記憶體分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...

C STL中的vector的記憶體分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...

C STL中的容器 Vector

c stl中的verctor好比是c語言中的陣列,但是vector又具有陣列沒有的一些高階功能。與陣列相比,vector就是乙個可以不用再初始化就必須制定大小的邊長陣列,當然了,它還有許多高階功能。要想用vector首先得包含標頭檔案vector。如果vector的元素型別是int,預設初始化為0 ...