2015-03-18 85 views
8

在C++中有兩種方法可以聲明一個對象。例如:基於C++堆棧的對象分配

// The first way 
vector<int> *nums = new vector<int>; 

// The second way 
vector<int> nums; 

人們說第一個聲明在堆中分配對象,在堆棧​​中分配第二個對象。我可以想象如果矢量對象在堆中,它是如何工作的。編譯器只會在堆中找到一個空閒塊來存儲該向量。但是,如果將對象分配到堆棧上,我會不斷向該向量推送新元素,會發生什麼情況?會有足夠的內存空間嗎?如果不是,當編譯器的大小可以改變時,編譯器如何在堆棧中找到足夠大的內存塊來存儲該向量?

+3

大初學者的問題,並很好地說明。 – 2015-03-18 21:59:28

回答

10

vector對象放在堆棧上並不意味着它會將其元素放在堆棧上。檢查文檔:

在內部,向量使用動態分配的數組來存儲它們的元素。插入新元素時,可能需要重新分配此數組以便增加大小,這意味着分配新數組並將所有元素移至其中。

來源:http://www.cplusplus.com/reference/vector/vector/

+1

是的。只有「包裝」向量在堆棧中。在內部它可能只包含一個指針。如果它是一個數組,那麼數組大小必須因爲你所問的問題而保持固定。 – 2015-03-18 22:04:56