關於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所占的內存空間

 

 

 

 

Reference

[1]http://stackoverflow.com/questions/10464992/c-delete-vector-objects-free-memory

[2]關於vector的內存釋放.http://blog.csdn.net/shenshenjin/article/details/6003425


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM