2009-09-22 31 views
7
class A 
{ 
public: 
    A(); 
    ~A(); 
    int X; 
}; 

A::A() 
{ 
    X = 5; 
    int Y = 4; 
} 

//..... in another file 
A * objectOnHeap = new A(); 

在這種情況下,既然「objectOnHeap」在堆上,X也在堆上,即使它不是特別新出來的?在這種情況下,Y被分配到堆棧中(當然,超出範圍),對嗎?堆上的對象的成員變量是否也自動堆在堆上?

我想知道是否在嘗試設想如何將對象存儲在內存中時已將電線交叉。

+1

'objectOnHeap'不是*堆在堆上。它在堆棧或數據段中。它的值是一個指針,它指向堆上的某個東西。 – 2009-09-22 17:08:17

+0

@Rob Kennedy,你能詳細說說數據段嗎?我明白你的觀點,儘管指針本身在堆棧中,但它指向的數據存儲在堆上。 – BuckFilledPlatypus 2009-09-22 18:25:20

回答

17

是的。它在堆上。基本上,分配給堆上的對象的空間足夠大以容納其所有成員變量。

5

是的,它在堆上。

一些細節: 當你使用「new」操作符,什麼情況是,編譯器在堆上的類分配足夠的空間,包括所需要的所有的成員變量(也可能是所有空間類,在這種情況下,它們的大小也需要計算,等等)。

之後,構造函數在數據成員類上調用,然後在類本身上調用。

只要你沒有專門在堆上分配內存(通常是使用new運算符,或者調用一個可以爲你做的函數),內存就被分配到堆棧上,就像你的例子中的變量y一樣。

3

我想你的問題的一半仍然沒有答案:你問Y是否仍然在堆棧中分配,這的確是對的。

0

由於本地創建,因此Y處於堆棧狀態; X在堆上。