una - ¿Los miembros de datos están asignados en el mismo espacio de memoria que sus objetos en C++?
sobrecarga de operadores poo (6)
Digamos que tengo una clase como esta:
class Test
{
int x;
SomeClass s;
}
Y lo instancia de esta manera:
Test* t = new Test;
¿Está x en la pila, o el montón? ¿Qué hay de s?
Cada vez que "crea una instancia" de un objeto / símbolo usando una nueva (estamos hablando de C ++ aquí), se asignará una nueva zona de memoria para este objeto. De lo contrario, se colocará en la zona de memoria "local".
El problema es que no tengo una definición estándar para la zona de memoria "local".
Un ejemplo
Esto significa que, por ejemplo:
struct A
{
A()
{
c = new C() ;
}
B b ;
C * c ;
}
void doSomething()
{
A aa00 ;
A * aa01 = new A() ;
}
El objeto aa00 se asigna en la pila.
Como aa00 :: b está asignado en una memoria "local" según aa00, aa00 :: b está asignado dentro del rango de memoria asignado por la nueva instrucción aa01. Por lo tanto, aa00 :: b también se asigna en la pila.
Pero aa00 :: c es un puntero, asignado con nuevo, por lo que el objeto diseñado por aa00 :: c está en el montón.
Ahora, el ejemplo complicado: aa01 se asigna a través de un nuevo y, como tal, en el montón.
En ese caso, como aa01 :: b se asigna en una memoria "local" de acuerdo con aa01, aa00 :: b se asigna dentro del rango de memoria asignado por la nueva instrucción aa01. Por lo tanto, aa00 :: b está en el montón, "dentro" de la memoria ya asignada para aa01.
Como aa01 :: c es un puntero, asignado con nuevo, el objeto diseñado por aa01 :: c está en el montón, en otro rango de memoria que el asignado para aa01.
Conclusión
Entonces, el objetivo del juego es:
1 - ¿Cuál es la memoria "local" del objeto estudiado: Stack of Heap?
2 - si el objeto se asigna a través de nuevo, entonces está fuera de esta memoria local, es decir, está en otra parte del montón
3 - si el objeto se asigna "sin nuevo", entonces está dentro de la memoria local.
4 - Si la memoria "local" está en la pila, entonces el objeto asignado sin nuevo también está en la pila.
5 - Si la memoria "local" está en el montón, entonces el objeto asignado sin nuevo también está en el montón, pero aún dentro de la memoria local.
Lo siento, no tengo un vocabulario mejor para expresar esos conceptos.
Como está utilizando algo nuevo, está asignando su objeto al montón. En consecuencia, todos los miembros del Test señalados por t también están en el montón.
Como usaste new
, todo está en el montón, almacenado [más o menos] contiguamente en el área de memoria de t
.
t está en la pila. El objeto en * t está en el montón. Contiene un int y un objeto SomeClass uno al lado del otro en una unidad.
class MyClass {
int i;
MyInnerClass m;
MyInnerClass *p = new MyInnerClass();
}
MyClass a;
MyClass *b = new MyClass();
a está en la pila; sus miembros ai y am (incluidos los miembros de am) y ap (el puntero, no el objeto al que apunta) son parte de él y también de la pila.
El objeto apuntado por ap está en el montón.
El objeto al que apunta b está en el montón, incluidos todos sus miembros; y así es el objeto apuntado por bp
Test a;
Test *t = new Test;
a, y todos sus miembros, están en la pila.
El objeto apuntado por t, y todos sus miembros, están en el montón.
El puntero t está en la pila.