vector刪除元素與清除內存空洞


問題:stl中的vector容器經常造成刪除假象,這對於c++程序猿來說是極其討厭的,《effective stl》大師已經將之列為第17條,使用交換技巧來修整過剩容量。
內存空洞這個名詞是網上的學者給出的。我認為用來描寫敘述這個基本現象特別easy提醒自己vector刪除的這個陷阱。

首先給出一段代碼:
35 void testvector()
36 {
38     vector v;
39     v.push_back(1);
40     v.push_back(2);
41     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
42     v.erase(v.begin());
43     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
44     vector(v).swap(v); // 清除v並且最小化它的容量
45     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
47 }

結果例如以下:
[hfx@didkey1 bin]$ ./test
v size = 2 v capacity = 2
v size = 1 v capacity = 2
v size = 1 v capacity = 1

分析:
能夠清楚地看到這個問題,在第一次 v.erase(v.begin());的時候,並沒有真正釋放刪除元素的內存,它的容量還是存着。

我也簡單描畫下這個生活中的問題——
你拿這一個1000升的水去沙漠上旅行,開始是滿的。可是,你的旅途讓你的水變成了1升。並且路途中,你沒有水資源讓你再次灌滿,那么。你一直將拖着一個1000升
容量的大水箱,載着1升水在旅行,你是不同意自己這樣做的。你僅僅有把這個水箱切了。切成10升或者1升,小點……
vector也一樣,你把水喝了。並不能把水箱也縮小,要把水箱縮小的做法——
——swap()交換函數完美釋放內存。
vector(v).swap(v); // 清除v並且最小化它的容量

注意:
a. erase()函數。僅僅能刪除內容,不能改變容量大小;
erase成員函數,它刪除了itVect迭代器指向的元素,而且返回要被刪除的itVect之后的迭代器,迭代器相當於一個智能指針。
b. clear()函數,僅僅能清空內容,不能改變容量大小
c. vector容器刪除不自己主動釋放內存。那么它存在內存泄露???不是的。vector在析構函數的時候。對內存進行了釋放。
d. 假設要想在刪除內容的同一時候釋放內存,那么你能夠選擇deque容器。
e. 關於vector:
vector相當於c++中的數組,數組在初始化的時候也須要給它一個數組空間大小,vector申請的時候將預留一個空間,比方10。在元素超過10的時候,vector自己主動將大小
擴大到兩倍。而且將元素拷貝過去。

使用方法舉例:
 vector(v).swap(v);將v的內存空洞清除
 vector().swap(v);清空vec


免責聲明!

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



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