[英]Will data members on a heap-allocated object be allocated on the heap or the stack?
[英]Will heap allocated objects have their members allocated on the stack?
讓我們考慮這個例子。
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,所以它的每個數據成員最終都進入了堆。
子對象具有與其所屬的完整對象相同的存儲期限。 如果動態分配了DynamiclyManagedObject
的實例,則銷毀DynamiclyManagedObject
時將銷毀StaticlyManagedObject
成員。
非正式地,您可能會說子對象將在且僅當完整對象在堆上時才在堆上。 但是,存儲期限是技術上談論它的正確方法。 堆和棧是實現細節。
StaticlyManagedObject
是錯誤的名稱。 它是動態分配的,與父對象相同。
嵌套的類成員使用與父對象相同的分配方法,除非將它們特別標記為static
,否則在創建對象時不會對其進行分配,或者在構造函數中對其進行動態分配。
您的類的成員是其他類還是基本數據類型:
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
的類成員。
在C ++中使用new運算符或在C中使用malloc進行動態分配時,無論類型(結構,類還是基元)如何(將結構的大小作為參數,以了解要分配多少字節),所有所需的空間(包含成員) 的一半將放置在堆上 。
這些調用返回指向已分配的堆存儲區的指針。
局部函數變量和參數始終放在堆棧中 。
如果聲明指針局部變量,它的位置仍將在堆棧上,但是您將必須使用上述動態分配方法來分配堆內存,堆棧分配的指針實際上將指向該堆內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.