vector記憶體的開闢與

2021-08-28 17:53:59 字數 1734 閱讀 9638

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;

vectorv;每次new之後呼叫v.push_back()該指標,在程式退出或者根據需要,用以下**進行記憶體的釋放:for (vector::iterator it = v.begin(); it != v.end(); it ++)

if (null != *it)

v.clear();

記憶體的動態開闢與釋放

malloc free與new delete 1 new會拋異常,但是malloc不會拋異常 2 new delete屬於操作符,但是malloc free屬於函式 3 new申請空間的時候會呼叫建構函式進行初始化,malloc不會 delete釋放記憶體時會呼叫析構函式,free只是切斷了指向關係...

linux的記憶體開闢

void kmalloc size t size,int flags kmalloc函式和malloc函式相似,它有兩個引數,乙個引數是size,即申請記憶體塊的大小 這個引數比較簡單,就像malloc中的引數一樣。第二個引數是乙個標誌,在裡面可以 指定優先權之類的資訊。在linux中,有以下的一些...

動態開闢記憶體總結

動態開闢記憶體是在程式執行過程中進行開闢空間的,主要在堆,棧中開闢 有關堆中動態開闢記憶體空間的函式有malloc,calloc,realloc,free。棧中開闢空間的有alloca。void malloc size t size void calloc size tnum,size tsize ...