完美刪除vector的“記憶體空洞”

來源:互聯網
上載者:User

問題: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.