vector記憶體的分配與釋放

2021-08-29 23:51:17 字數 1247 閱讀 8122

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()

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; 

vectorv;

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

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

if (null != *it)

v.clear();

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

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

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

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

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

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