2010-05-07 58 views
5
vector<int> vect; 
int *int_ptr = new int(10); 
vect.push_back(*int_ptr); 

我認爲每個「新」需要後面跟着一個「刪除」,但是clear()方法是否清理這個內存?C++內存分配問題涉及向量

什麼做同樣的事情的這個方法:

vector<int> vect; 
int int_var = 10; 
vect.push_back(int_var); 

從我的理解,明確()調用析構函數的變量,但在這個例子中都vect.push_back()方法上推的對象矢量,而不是一個指針。那麼使用int指針的第一個例子需要clear()來清除內存?

回答

5

第一個方法泄漏,因爲該向量永遠​​不會獲得分配的指針的所有權。事實上,它根本不包含指針,只有一個值的副本。

第二種方法不會泄漏,因爲沒有內存是動態分配的(除非在向量中內部 - 它會處理內存本身)。

+0

當你說它會處理內存本身,你的意思是我調用vector.clear()後? – TheFuzz 2010-05-07 20:43:23

+0

當矢量被銷燬時,內存將被恢復。 clear()實際上不會釋放任何內存;該載體將保留該容量以防需要稍後再次增長。 – 2010-05-07 20:47:48

+0

那麼是什麼阻止了我根本不使用指針,並簡單地創建臨時堆棧變量,然後在需要時將它們推送到向量上?由於某種原因,指針失去了他們的觀點。 – TheFuzz 2010-05-07 21:08:31

5

當你push_back on a vector,你添加一個拷貝的數據到載體。因此,在這兩種情況下,原始數據仍然需要被釋放。在第一種情況下,您需要刪除它;在第二種情況下,堆棧指針在超出範圍時將被「釋放」。

2

向量在push_back上進行復制。由於指針只是'另一個變量'(但恰好指向內存),所以當您push_back先前已分配的整數指針時,將指針的值複製到向量中,導致潛在的懸空指針,因爲它們會是指向記憶中同一點的兩個指針。

在第一個示例中,您需要手動刪除內存。我已經在過去用於與圖類插手一種策略是有這樣的事情(大量的東西節錄由於是在工作和快速打字):

class graph //quick-format 
{ 
vector<node*> nodes; 
add_node(node n) 
{ 
    node *temp = new node; 
    *temp = n; 
    nodes.push_back(temp) 
} 
~graph() 
{ 
    for(int i = 0; i < nodes.size(); i++) 
     delete nodes[i]; 
} 
}; 

一個簡單的警告,圖的複製語義將不得不被檢查。就目前而言,它會導致刪除以前不用的內存。好處是你總是可以有相同的一組節點。 警告Emptor,就像任何直接內存使用情況一樣。

但是,如果您只是簡單地按下一個非指針變量,則不會有內存從您的末端泄漏的可能性。可能矢量會泄漏,但是......在這個工具成熟的時候,這實際上是不可能的。