簡體   English   中英

堆分配的對象會在堆棧上分配其成員嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM