剛才在研究cocos2d-x原始碼時,遇到這麼幾行**:
void autoreleasepool::clear()
}
autoreleasepool是乙個用來託管記憶體的物件池,_managedobjectarray是乙個std::vector型別的成員,用來儲存所有管理的物件,這幾行**要做的事情就是:遍歷所有物件,依次呼叫他們的release()方法,最後清空這個vector。
但是注意到這兩句:
std::vectorreleasings;
releasings.swap(_managedobjectarray);
把乙個預設的臨時物件和原有的成員進行了swap,然後對交換後的臨時物件進行遍歷。這看起來好像是有點多餘?為什麼不直接遍歷_managedobjectarray,然後再呼叫其clear()方法呢?
《effective stl》第17條:從vector中刪除元素縮減了該vector的大小(size),但是並沒有減小它的容量(capacity)。
了解stl的同學都知道size和capacity的區別,那麼這裡的swap呼叫就能清楚作者意圖了:遍歷完vector後還要釋放其所佔的記憶體,簡單地呼叫clear方法並不能解決問題。
swap方法的原理是交換兩個vector的內部指標以達到「交換整個容器」的效果,所以在和預設的臨時變數swap後,成員變數_managedobjectarray確實是個空的容器(包括記憶體),
臨時變數在函式結束時析構,而vector正是在其析構函式中釋放記憶體的,所以在函式結束時,所有多餘的記憶體都被釋放,一切安好!
同學們記住了,這樣的技巧可以用來清空乙個vector的記憶體:
vector().swap(_vectortobereleased);
其效果等價於(注意花括號):
該技巧同樣適用於std::string。
C vector容器 互換容器
vector容器互換 功能描述 實現兩個容器內元素進行互換 函式原型 swap vec 將vec與本身的元素互換 1.基本使用 如下 include using namespace std vector容器互換 include 1.基本使用 void printvector vector int v...
c vector容器的用法
vector 是向量型別,它可以容納許多態別的資料,如若干個整數,所以稱其為容器。vector 是c stl的乙個重要成員,使用它時需要包含標頭檔案 include using namespace std 一 vector 的初始化 可以有五種方式,舉例說明如下 1 vectora 10 定義了10...
C vector容器型別
vector類為內建陣列提供了一種替代表示,與string類一樣 vector 類是隨標準 c 引入的標準庫的一部分 為了使用vector 我們必須包含相關的標頭檔案 include 使用vector有兩種不同的形式,即所謂的陣列習慣和 stl習慣。1.定義乙個已知長度的 vector vector...