2011-01-07 184 views
0

我在堆上分配一個類對象,所以所有的數據成員都將堆在堆上。但是,如果我的類包含一些數據結構(例如std::vector)爲成員:將堆分配對象上的數據成員分配到堆還是堆棧上?

#include <vector> 

class Temp 
{ 
public: 
    std::vector<double> m_dPtList; 
}; 

int main() 
{ 
    Temp* pTemp = new Temp; 
    pTemp->m_dPtList.Add(10.0); 
    pTemp->m_dPtList.Add(20.0); 
    pTemp->m_dPtList.Add(30.0); 

    return 0; 
} 

將值10.020.0,並30.0被存儲在堆或堆棧上?

+0

它爲什麼重要?注意:堆和棧是與對象無關的實現細節(它不關心它在哪裏,所以你應該)。 – 2011-01-07 14:12:11

+0

[數據成員是否可以在與C++中的對象相同的內存空間中分配?](http://stackoverflow.com/questions/187797/are-data-members-allocated-in-the-same-memory- space-as-their-objects-in-c) – 2012-07-30 20:14:36

回答

1

vector的緩衝區總是分配在堆上,但是一般來說,它的目標是被設計成 - 即時成員將被分配在同一個地方,但上帝知道嵌入式指針會指向哪裏。

+0

不是100%正確。矢量存儲區由分配器生成。分配器從內存中獲取內存的位置是未定義的(儘管缺省內存會動態分配內存(即它具有動態存儲持續時間)(儘管這不代表堆,因爲這超出了C++的範圍並且是實現細節))) – 2011-01-07 14:18:32

2

pTemp在堆上。 您通過值添加到矢量中,所以值被添加到矢量中,矢量本身在堆上分配存儲。 情況下,當內容是在棧上是:

Class Temp 
{ 

std::vector<double *> m_dPtList; 

} 

double temp = 10.0; 
Temp* pTemp = new Temp(); 

pTemp->m_dPtList.Add (&temp); 
0

在你的代碼,Temp的只是包裝std::vector。您使用new來創建Temp對象,因此它會放在堆上。該對象本身可以包含一個指向存儲器的指針,在這個存儲器中矢量將存儲添加到其中的數據......這也將在堆上。總而言之,只有pTemp指針本身在您的堆棧上。