最近跑乙個程式,結果2g記憶體用完了,結果也沒算出來,出現std::bad_alloc,應該是程式中某個地方記憶體空間沒有及時釋放,開始檢查程式。發現好多地方用到vector,而且有些會很大,並且只是中間結果,只是因為需要在多個地方訪問,定義為了類的成員變數,要等到這個類解析的時候才釋放空間,看來應該在程式中,它的中間作用結束之後便釋放記憶體。於是開始探索如何釋放vector的記憶體。
1、vector的成員函式 clear()
clear()只是清除vector中的變數,並不釋放記憶體。乙個簡單的測試程式如下,
intmain()
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新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空...