以前一直想當然的以為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所占的內存空間
Reference
[1]http://stackoverflow.com/questions/10464992/c-delete-vector-objects-free-memory
[2]關於vector的內存釋放.http://blog.csdn.net/shenshenjin/article/details/6003425