Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 4 Junio 2013, 23:14 pm



Título: [DUDA] Memoria Dinámica en C++
Publicado por: Zodiak98 en 4 Junio 2013, 23:14 pm
Hola bueno tengo una duda que me he querido aclarar desde hace un tiempo mi duda es la siguiente, ejemplo si yo tengo una clase con el nombre de "Coche"

Y yo en la función principal hago algo como esto:

Código
  1. int main()
  2. {
  3. Coche *ejemplo = new Coche();
  4. }
  5.  
  6.  
Qué es lo que estoy haciendo ahí realmente? Hasta ahora tengo entendido que el Heap devuelve una dirección de memoria por eso la variable tiene que declararse como Puntero, pero sí yo hago eso qué es lo qué estoy haciendo ahí realmente? Quizas la respuesta sea algo sencilla pero la verdad quisiera que me la explicaran claramente. :)


Título: Re: [DUDA] Memoria Dinámica en C++
Publicado por: amchacon en 5 Junio 2013, 00:01 am
Cuando ejecutas un programa, el sistema le asigna una memoria para su uso interno. Se conoce como memoria de pila y es muy rápida porque todo se encuentra de forma lineal y adyacente. No hay fragmentación alguna

Ahora bien, esta memoria es bastante limitada:

Código
  1. int Cosa[10000];

Esto dará un error al ejecutarlo porque la memoria de la pila es muy limitada y si nos pasamos declarando más cosas de la cuenta, podríamos acabar dando cuenta que nos hemos agotado la pila y estamos en la memoria de otro programa (por suerte, el SO no nos dejará que nos vayamos de nuestra frontera y cerrará el programa con el famoso error de "Violación del segmento").

Esto nos lleva a una encrucijada, nuestro pc tiene 4 gb de ram pero no podemos utilizar más que una poquita. Por suerte para evitar esto tenemos el famoso new (malloc en C):

Código
  1. int* Cosa = new int[10000];

Lo que hace es pedirle al sistema operativo "memoria adicional", el sistema operativo buscará memoria libre. Si es posible satisfacer la petición, nos reservará dicha memoria y nos devolverá un puntero con la dirreción donde se encuentra la memoria.

¿Por que necesitamos un puntero? Porque la memoria que nos dará el SO puede encontrarse en cualquier lugar, para que podamos operar con ella el SO nos dá su dirreción.

La memoria sigue reservada hasta que el programa se cierra o hasta que se hace un delete. El delete le dice al SO que ya no necesita esa memoria y que puede liberarla.

Hay un error de programación conocido como falla de memoria. Consiste en que pides memoria con new pero después pierdes su dirreción, por lo que no puedes operar con ella. Aquí un ejemplos:

Código
  1. char* Cosa = new char[10];
  2. Cosa = new char[5];

Este es un error grave, hemos reservado 15 bytes en la memoria pero solo tenemos la dirreción de los 5 últimos bytes. Los primeros 10 bytes no podemos usarlos porque hemos perdido su dirreción (tampoco podemos liberarla por la misma razón). Lo gracioso esque al sistema operativo le consta como memoria reservada, ya hemos desperdiciado 10 bytes de memoria.


Este concepto aplicado a clases (como la clase coche) funciona de forma similar, calcula cuantos bytes ocupan las variables de la clase y le pide al sistema operativo esa cantidad de bytes.


Título: Re: [DUDA] Memoria Dinámica en C++
Publicado por: 0xDani en 5 Junio 2013, 16:59 pm
@amchacon, te ha faltado decir que el operador new no sólo reserva memoria en la heap, sino que en el caso de clases y estructuras construye objetos, porque llama a los constructores de los objetos después de reservar memoria para albergarlos.

Por lo demás tu explicación es bastante completa.

Saludos.


Título: Re: [DUDA] Memoria Dinámica en C++
Publicado por: Zodiak98 en 5 Junio 2013, 18:48 pm
Gracias a los 2 :D, hasta ahora según lo que he leído es qué, es exactamente lo mismo, solo con la diferencia de qué el objeto se instancia en el Heap en lugar de la Pila. Y automáticamente se inicia el constructor, que es exactamente lo mismo que pasa cuando se crea un objeto normalmente.