1. 程式人生 > >關於vector的記憶體釋放問題

關於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所佔的記憶體空間