關於vector的記憶體釋放問題
關於vector的記憶體釋放問題
以前一直想當然的以為vector 的clear()函式會保證釋放vector的記憶體,今天網上一查資料發現完全不是我想象的那樣子。
比如有如下程式碼:
1 tempObject obj1; 2 tempObject obj2; 3 vector<tempObject> tempVector; 4 5 tempVector.pushback(obj1); 6 tempVector.pushback(obj2);
tempVector.clear();
呼叫clear()函式只會呼叫tempObject的解構函式,從而釋放掉obj1和obj2兩個物件,不會釋放vector所佔用的記憶體。真正釋放vector所佔用的記憶體,要到vector物件離開作用域時,自動呼叫vector的解構函式釋放記憶體。當然有一種強制釋放記憶體的方法,比如針對上面的程式碼:
vector<tempObject>().swap(tempVector); That will create an empty vector with no memory allocated and swap it with tempVector, effectively deallocating the memory.
需要注意的是:
vector 中的內建有記憶體管理,當 vector 離開它的生存期的時候,它的解構函式會把 vector 中的元素銷燬,並釋放它們所佔用的空間,所以用 vector 一般不用顯式釋放 —— 不過,如果你 vector 中存放的是指標,那麼當 vector 銷燬時,那些指標指向的物件不會被銷燬,那些記憶體不會被釋放。
總結:
vector與deque不同,其記憶體佔用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有一個,但是記憶體佔用仍為10,000個。所有空間在vector析構時回收。
empty()是用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),所佔用的記憶體空間依然如故。如果你需要空間動態縮小,可以考慮使用deque。如果非要用vector,這裡有一個辦法:
在《effective STL》和其實很多C++文章中都有指明,用clear()無法保證記憶體回收。但是swap技法
vector<int> nums;
nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(2);
vector<int>().swap(nums); //或者nums.swap(vector<int>());
vector<int>().swap(nums); 或者如下所示 加一對大括號都可以,意思一樣的:
{
std::vector<int> tmp = nums;
nums.swap(tmp);
}
加一對大括號是可以讓tmp退出{}的時候自動析構
swap技法就是通過交換函式swap(),使得vector離開其自身的作用域,從而強制釋放vector所佔的記憶體空間