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

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

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

En este caso, dado que "objectOnHeap" está en el montón, ¿X también está en el montón a pesar de que no se inventó específicamente? Y en este caso, Y se asigna en la pila (y, por supuesto, queda fuera del alcance), ¿correcto?¿Las variables miembro de un objeto que está en el montón también están automáticamente en el montón?

Me pregunto si he visto mis cables cruzados cuando trato de imaginar cómo se almacenan los objetos en la memoria.

+1

'objectOnHeap' no está * en el montón. Está en la pila o en el segmento de datos. Su valor es un puntero, que * apunta * a algo en el montón. –

+0

@Rob Kennedy, ¿pueden dar más detalles sobre el segmento de datos? Sin embargo, veo tu punto de que el puntero está en la pila, pero los datos a los que apunta son almacenados en el montón. – BuckFilledPlatypus

Respuesta

17

Sí. Está en el montón. Básicamente, el espacio asignado a un objeto en el montón es lo suficientemente grande como para contener todas sus variables miembro.

5

Sí, está en el montón.

Algunos detalles: Cuando se utiliza el operador "new", lo que sucede es que el compilador asigna suficiente espacio en el montón de la clase, incluyendo todo el espacio necesario para todas las variables miembro (que también podría ser clases, en cuyo caso también se debe calcular su tamaño, etc.).

Después de esto, se llama al constructor sobre las clases de miembro de datos, y luego sobre la propia clase.

Cuando no asigna memoria específicamente en el montón (generalmente usando el nuevo operador o llamando a una función que lo hace por usted), la memoria se asigna en la pila, como la variable y en su ejemplo.

3

Supongo que la mitad de su pregunta sigue sin respuesta: usted estaba preguntando si Y todavía está asignado en la pila, eso es correcto.

0

Y está en la pila ya que se creó localmente; X está en el montón.

Cuestiones relacionadas