Vector的記憶體釋放

2021-06-05 21:54:44 字數 2443 閱讀 5195

最近跑乙個程式,結果2g記憶體用完了,結果也沒算出來,出現std::bad_alloc,應該是程式中某個地方記憶體空間沒有及時釋放,開始檢查程式。發現好多地方用到vector,而且有些會很大,並且只是中間結果,只是因為需要在多個地方訪問,定義為了類的成員變數,要等到這個類解析的時候才釋放空間,看來應該在程式中,它的中間作用結束之後便釋放記憶體。於是開始探索如何釋放vector的記憶體。

1、vector的成員函式 clear()

clear()只是清除vector中的變數,並不釋放記憶體。乙個簡單的測試程式如下,

int

main()

cout

<<

a.size()

<<""

<<

a.capacity()

<<

endl;

a.clear();

cout

<<

a.size()

<<""

<<

a.capacity()

<<

endl;

return0;

}

輸出是:

10   16

0    16

size給出vector中的元素個數,capacity給出vector占用的記憶體大小,單位是vectot中的元素型別占用的記憶體大小。

可以看到,vector申請的記憶體空間並不是與元素個數相等,vector的記憶體空間是可以動態增長的,比如一開始vectora只申請了4個double的空間,當元素個數超過4個時,vector重新分配記憶體。最後有10個元素時,vector占用16個double的空間。當執行clear之後,元素個數為0,但占用的記憶體空間沒變,也就是說,vectora占用的記憶體空間沒有得到釋放。由於它不是new申請的空間,所以不能使用delete。那麼該如何釋放這樣的記憶體空間呢?

2、swap方法

在 給出了兩種釋放vector占用記憶體的方法,試用了一下。

a.swap(vector

<

double

>

());

編譯的時候報錯了, error: no matching function for call to 『std::vector>::swap(std::vector>)』/usr/include/c++/4.4/bits/stl_vector.h:929: note: candidates are: void std::vector<_tp, _alloc>::swap(std::vector<_tp, _alloc>&) [with _tp = double, _alloc = std::allocator]

swap的引數應該是乙個vector的引用,雖然swap是通過將vectora與乙個臨時變數的空間交換,交換之後,a的空間為0,臨時變數的空間為a之前的空間,然後臨時變數在這個過程結束的時候,記憶體空間被釋放。這樣達到釋放a的空間,在a不是臨時變數的時候。將上面的一條語句改為兩條,

vector

<

double

>

b;a.swap(b);

這樣便不會報錯了。這是引用和值傳遞的區別。

文章中還給出了一種方法,試了一下,占用空間沒有改變,不知道為什麼。鏈結給出的文章講了部分內容,可做參考。

3、陣列元素為指標的時候的記憶體釋放

很多時候,我們會用vector儲存一組指標,

vector

<

classtype

*>s;

這個時候,swap也只是清空這些指標占用的空間,但指標指向的類的例項佔的空間是沒有被釋放的。對於這種vector,需要手動地釋放這些空間。

classtype 

*item

=null;

for(i=0

;i<

s.size();i++)

vectorstmp;

//釋放vector占用的空間

s.swap(stmp);

在乙個函式內部,臨時變數在函式退出時釋放記憶體,如果想盡快釋放掉記憶體,可以考慮用new申請臨時變數的空間,然後盡快delete。如下,

vector

<

classtype

*>

*stemp

=new

vector

<

classtype

*>

();s.swap(

*stmp);

for(i=0

;i<

stmp

->

size();i++)

delete vector

<

classtype

*>

stmp;

第三部分的內容只是想法,還沒有驗證。

vector記憶體釋放

centroidbinary.swap vector 前面的是vector 由於vector的記憶體占用空間只增不減,比如你首先分配了10,000個位元組,然後erase掉後面9,999個,留下乙個有效元素,但是記憶體占用仍為10,000個。所有記憶體空間是在vector析構時候才能被系統 empt...

vector的記憶體釋放

1.vector 容器的記憶體自增長 與其他容器不同,其記憶體空間只會增長,不會減小。先來看看 c primer 中怎麼說 為了支援快速的隨機訪問,vector 容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當 vector 新增乙個元素時,為了滿足連續存放這個特性,都需要重...

vector的記憶體釋放

1.vector容器的記憶體自增長 與其他容器不同,其記憶體空間只會增長,不會減小。先來看看 c primer 中怎麼說 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空...