2013-10-31 20 views
2

我想確保了以下工作,因爲我不打算內存泄漏:C++ 2D矢量清晰地按照預期工作?

vector<vector <float> > X; 
for (int i = 0; i < some_size; i++) 
{ 
    vector<float> column; 
    X.push_back(column); 
} 
// ... use 2D array somehow 
X.clear(); 
/* CALLS DESTRUCTOR OF EACH ELEMENT, BUT SINCE EACH ELEMENT 
IS A VECTOR, CLEAR IS RECURSIVELY CALLED ON EACH OF THOSE*/ 

也就是說,clear()遞歸地應用於由於clear是一個向量的析構函數的部位矢量的載體?

我知道X在超出範圍時被完全清除,但這不是問題的關鍵。

+11

是的。 (插入更多字符) – yngccc

+0

僅供參考,您的'for'循環可以簡化爲'X.resize(some_size)',或者您可以將其創建爲'vector > X(some_size);' –

回答

3

是和否。它將調用頂層向量中每個元素的析構函數,並且每個向量的析構函數將清除它自己的內存(所以它不必爲每個內部向量調用clear)。

clear不是保證釋放頂層向量使用的內存,但是。

+0

就是這樣。 –

+0

你能詳細說明一下嗎?頂級,X是什麼意思?那麼,如果我需要在X超出範圍之前執行此操作,clear()後應該怎麼做? – Tommy

+0

@Tommy:在此上下文中的「頂部」是指外部向量(您在此創建的2D向量的第一維)。由於該向量中的每個元素也是一個向量。當你調用'clear'時,它會調用析構函數爲其中的每個元素(每個矢量)。它不保證釋放空間*(它表示外部矢量)正在使用的空間。如果你想這樣做,你可以通過'vector >()。swap(X)'來實現,這將有效地減少向量到實現默認容量的能力。 –

3

添加到扎克霍蘭德的回答,爲documentationvector<T>::clear表明,

重新分配並不一定會發生的,和矢量能力 不能保證因調用此函數改變。一種典型的替代 迫使重新分配是使用交換:

vector<T>().swap(x); // clear x reallocating 

這將交換的臨時空載體的內容與那些x。然後,析構函數將被調用臨時(先前爲空)的向量,該向量將依次調用所有向量元素的析構函數,最後將釋放所有空間。

+0

交換將不會重新分配 –

+0

@DieterLücking:我沒有說它會(實際上我甚至沒有使用這個詞,摘錄來自文檔)。在最後一段中,我解釋了爲什麼這個空間將被分配;它不是交換,它是暫時的空向量。 – nickie