vector刪除元素與清除記憶體空洞

2021-07-03 02:24:28 字數 1174 閱讀 7629

問題:stl中的vector容器常常造成刪除假象,這對於c++程式設計師來說是極其討厭的,《effective stl》大師已經將之列為第17條,使用交換技巧來修整過剩容量。

記憶體空洞這個名詞是網上的學者給出的,我覺得用來描述這個基本現象特別容易提醒自己vector刪除的這個陷阱。

首先給出一段**:

35 void testvector()

36 結果如下:

[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

swap清除vector占用記憶體

vector與deque不同,其記憶體占用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有乙個,但是記憶體占用仍為10,000個。所有空間在vector析構時 empty 是用來檢測容器是否為空的,clear 可以清空所有元素。但是即...

vector容器記憶體清除測試

實際應用中僅用clear不足以清除容器額外分配出來的記憶體空間,需要借助 swap方法實現清除,測試 如下,測試的時候可以開啟任務管理器跟蹤觀察記憶體變化。using namespace std vector v int main for int i 0 i 100000 i v.push back...

Vector容器刪除元素

使用vector容器也有一段時間了,但是對於他的刪除操作還是有點疑問,今天就總結一下。vector資料儲存是一段預先分配好大小的記憶體連續的空間,插入資料和刪除資料都會引起後面資料記憶體的整體移動。今天就說說刪除操作吧 1 刪除最後的元素 直接使用pop back 就可以了,這個沒什麼好說的 2 刪...