2016-08-19 187 views
1

我們來考慮一下這個例子。堆分配的對象是否將其成員分配到堆棧上?

class StaticlyManagedObject 
{ 
    //some class members.... 
} 
class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; //is this still allocated at the stack? 

} 

class Foo 
{ 
    DynamiclyManagedObject * _dynamiclyManagedObject; //will be allocated in the heap. 
    Foo() 
    { 
     _dynamiclyManagedObject = new DynamiclyManagedObject(); 
    } 
} 

有人告訴我,當我們沒有在C++中使用動態內存管理,事情在堆棧中分配,我們不需要內存管理。

但是,在這個例子中。我們有一個名爲DynamiclyManagedObject的動態分配對象,我在Foo構造函數中實例化這個對象。我的問題是DynamiclyManagedObject的靜態管理數據成員會發生什麼?

它是否仍然在堆棧上創建或..因爲DynamiclyManagedObject在堆中創建,它的每個數據成員都會堆到堆中。

回答

4

子對象與它所屬的完整對象具有相同的存儲持續時間。如果DynamiclyManagedObject的實例是動態分配的,那麼當銷燬DynamiclyManagedObject時,StaticlyManagedObject成員將被銷燬。

非正式地,當且僅當整個對象位於堆上時,您可能會說子對象將在堆上。但是,存儲時間是談論它的技術上正確的方式;堆和堆棧是實現細節。

+0

非常感謝您的好解釋。我得到的所有答案同樣很棒。另外感謝提及存儲時間。快速搜索顯示瞭如此多的答案。現在我可以更多地瞭解它。 – Nusakan

3

StaticlyManagedObject是一個用詞不當。它是動態分配的,與父對象相同。

嵌套類成員使用與父對象相同的分配方法,除非它們具體標記爲static,在這種情況下,它們在創建對象時未分配,或者它們在構造函數中被動態分配。

+0

感謝您澄清「StaticlyManagedObject」是動態分配的。 – Nusakan

2

無論你的類的成員是另一個類,或基本數據類型:

class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; 
    int some_integer; 
}; 

不要緊類的成員是否是另一個類,或基本數據類型,如int 。 「_staticlyManagedObject」和「some_integer」都是完全相同的,除了它們的類型(當然,這不完全是一個微不足道的屬性)。一個是int,另一個是其他一類。類成員的類型不影響其範圍。整個類都是動態分配的,否則不是。或者它在自動作用域中分配(在堆棧中,如你所說)。

唯一的例外是static類成員:

class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; 
    int some_integer; 

    static std::string some_string; 
}; 

的規則是不同的some_string。請注意,這是一個真正的靜態類成員,而不是類型恰好爲StaticallyManagedObject的類成員。

0

不考慮類型的(可能是一個結構,類或原語),在C++或下用的malloc(它可以獲取您的結構作爲參數的大小動態分配使用新操作者時,要知道要分配多少字節) - 所有需要的空間(包含成員)將被放置在堆上。

這些調用返回一個指向已分配的堆內存區域的指針。

本地功能變量和參數始終放置在堆棧上。

如果你聲明一個指針局部變量,它的位置仍然會在堆棧上,但是你將不得不使用上面提到的動態分配方法來分配堆棧分配指針實際指向的堆內存。