c++ vector中resize與reserve的比較:
因此,接下來記錄vector是如何進行記憶體的分配與釋放的
c++ primer:為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存
vector的乙個特點:記憶體空間只會增長,不會減小
設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣效能難以接受。因此stl實現者在對vector進行記憶體分配時,其實際分配的容量要比當前所需的空間多一些
在呼叫push_back時,每次執行push_back操作,相當於底層的陣列實現要重新分配大小;這種實現體現到vector實現就是每當push_back乙個元素,都要重新分配乙個大乙個元素的儲存,然後將原來的元素拷貝到新的儲存,之後在拷貝push_back的元素,最後要析構原有的vector並釋放原有的記憶體
例如下面程式:
執行
pointvec.push_back(a);
此時vector會申請乙個記憶體空間,並呼叫拷貝建構函式將a放到vector中
再呼叫
pointvec.push_back(b);
此時記憶體不夠 需要擴大記憶體,重新分配記憶體 這時再呼叫拷貝建構函式將a拷貝到新的記憶體,再將b拷入新的記憶體,同時有人呼叫point拷貝建構函式,最後釋放原來的記憶體 此時呼叫point的析構函式
由於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)的錯誤,原因可能是重複釋放記憶體
如果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();
Objective C 記憶體管理 物件建立與釋放
基本概念 objective c中記憶體管理使用保留計數 retain count 基本原則是乙個物件 object 的保留計數如果大於0,那麼這個物件存在,如果等於0,則系統自動刪除,相當於沒媽的孩子。乙個物件可 以有多個擁有者 owner 不好意思,前面舉了個很不恰當的例子,乙個孩子不能有多個媽...
c vector的記憶體釋放
c 中vector的乙個特點是 記憶體空間只會增長,不會減小。即為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都挨著前乙個元素儲存。設想,如果每次vector新增乙個新元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 撤銷舊空間,這樣效能就會非常慢,所以,實際...
C vector的記憶體處理
1 std vectortest clear 2test clear.clear 3 test clear.shrink to fit 上週幫人做了個作,用c 實現一些演算法,因為好久沒碰 了,結果vector好多都不會用了,這裡記錄下vector的記憶體處理。一般情況下是不需要幫vector請理的...