完美刪除vector的“內存空洞”


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