vector記憶體釋放機制

2021-06-18 12:40:01 字數 1671 閱讀 2157

vector 中的內建有記憶體管理,當 vector 離開它的生存期的時候,它的析構函式會把 vector 中的元素銷毀,並釋放它們所占用的空間,所以用 vector 一般不用顯式釋放 —— 不過,如果你 vector 中存放的是指標,那麼當 vector 銷毀時,那些指標指向的物件不會被銷毀,那些記憶體不會被釋放。

vector的工作原理是系統預先分配一塊capacity大小的空間,當插入的資料超過這個空間的時候,這塊空間會讓某種方式擴充套件,但是你刪除資料的時候,它卻不會縮小。

vector為了防止大量分配連續記憶體的開銷,

保持一塊預設的尺寸的記憶體,clear只是清資料了

未清記憶體,因為vector的capacity容量未變化,系統維護乙個的預設值

有什麼方法可以釋放掉vector中占用的全部記憶體呢?

標準的解決方法如下

template < class t >

void clearvector( vector< t >& vt )

舉例1:

vectorvec(100);

cout << vec.capacity() << endl;

vector().swap(vec);

cout << vec.capacity() << endl;

舉例2:

std::vectorv(1024*1024);

v.resize(12);

沒看懂這可以釋放記憶體

vector().swap(v);

或者

利用vector釋放指標

#include

using namespace std;

vectorv;

每次new 之後呼叫v.push_back()該指標,

在程式退出時或其它你認為適當的時候,執行如下**:

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

}v.clear();

remark:若你的程式是多執行緒的,注意一下執行緒安全問題,必要時加個臨界區控制一下。

總結:vector與deque不同,其記憶體占用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有乙個,但是記憶體占用仍為10,000個。所有空間在vector析構時**。

empty()是用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),所占用的記憶體空間依然如故。如果你需要空間動態縮小,可以考慮使用deque。如果非要用vector,這裡有乙個辦法:

在《effective stl》和其實很多c++文章中都有指明,用clear()無法保證記憶體**。但是swap技法可以。具體方法如下所示:

vectornums;

nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(2);

vector().swap(nums);//或者nums.swap(vector());

vector().swap(nums); 或者如下所示 加一對大括號都可以,意思一樣的:

加一對大括號是可以讓tmp退出{}的時候自動析構

swap技法就是通過交換函式swap(),使得vector離開其自身的作用域,從而強制釋放vector所佔的記憶體空間

vector記憶體釋放

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

Vector的記憶體釋放

最近跑乙個程式,結果2g記憶體用完了,結果也沒算出來,出現std bad alloc,應該是程式中某個地方記憶體空間沒有及時釋放,開始檢查程式。發現好多地方用到vector,而且有些會很大,並且只是中間結果,只是因為需要在多個地方訪問,定義為了類的成員變數,要等到這個類解析的時候才釋放空間,看來應該...

vector的記憶體釋放

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