2013-02-06 84 views
3

當我們在一個函數內(例如,x是一個局部變量)在C++中實例化一個像int x這樣的變量時,它被分配在進程的堆棧之上。但是如果我們做int *x= new int,空間是堆中提供的。對象的內存分配

所以,我的問題是:不同類別的

  1. 什麼對象(用C++或用戶提供的類定義的)?他們的對象在哪裏實例化?例如:讓員工是一個班級,我們宣佈Employee emp;emp給出空間 - >堆棧或堆?

  2. 如果聲明int a[4]在一個函數內,那麼a的所有四個單元格是否會在堆棧上獲得空間?

+0

我想提一提的是'new',如果不超載,在所謂的自由存儲,這不一定是堆分配空間,雖然在實踐它。如果**被**超載,'new'可以做任何事情。 – Alex

回答

2
  1. 這取決於。如果Employee具有僅在堆棧上分配的成員,則整個對象爲。但是,Employee可能有指針成員,並且Employee的構造函數可能會在堆上爲它們分配內存。然後一些成員在堆上,一些在堆上。

  2. 是的。

5

它與正常類型完全一樣。

Class a; //stack. Usage: a.somethingInsideOfTheObject 
Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject 

注意,如果類本身在堆中分配的東西,這部分將永遠是在堆中,例如:

class MyClass 
{ 
public: 
    MyClass() 
    { 
     a = new int(); 
    } 
private: 
    int * a; 
}; 

void foo() 
{ 
    MyClass bar; 
} 
在這種情況下

bar變量將在被分配堆棧,但其內部的a將分配在堆上。

+1

值得注意的是,如果'Class'在內部使用'new',即使'a'本身駐留在堆棧上,它總是使用堆。 – NPE

+0

@NPE,是的,但只要你把它們當作黑盒子,你幾乎不會知道它 – SingerOfTheFall

+1

@SingerOfTheFall - 真的,它仍然是一個重要的細節。 –

7

所有局部變量,無論來自類的內置類型,還是它們是數組,都在堆棧中。所有動態分配都在堆上。

當然,像局部變量static這樣的修飾符會將變量放在其他位置,所以它在函數調用之間保留。另外,當你創建一個局部指針變量並使其指向一個動態分配的對象時(例如,

Class* a = new Class; 

實際變量a是在堆棧上,但它指向的存儲器是在堆上。


附錄:C++規範實際上沒有提到任何有關堆棧或堆的內容,只是不同類型變量的行爲。

2

用戶定義的類(和類型)與內置類型沒有區別。 所以

Employee emp; // allocated in stack 
Employee* emp = new Employee(); // allocated in heap 

關於你的第二個問題,本地陣列上的堆棧中分配

Employee emp[4]; // 4 instances on stack 
1

一般情況下,如果編譯器在編譯時(即局部變量)知道它,它的堆棧。
如果編譯器在編譯時不知道它(即通過newmalloc等動態分配),它就在堆上。

這篇文章有詳細的解釋:global-memory-management-in-c-in-stack-or-heap