elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [DUDA] Memoria Dinámica en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA] Memoria Dinámica en C++  (Leído 2,377 veces)
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
[DUDA] Memoria Dinámica en C++
« 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. :)


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [DUDA] Memoria Dinámica en C++
« Respuesta #1 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.


« Última modificación: 5 Junio 2013, 00:32 am por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [DUDA] Memoria Dinámica en C++
« Respuesta #2 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.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: [DUDA] Memoria Dinámica en C++
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Memoria Dinamica
Programación C/C++
Pepe2009 6 2,904 Último mensaje 13 Agosto 2013, 17:59 pm
por Pepe2009
Duda sobre memoria dinamica C++
Programación C/C++
erest0r 6 3,649 Último mensaje 11 Septiembre 2013, 09:34 am
por erest0r
Duda con memoria dinámica y arrays
Programación C/C++
Bob1098 6 2,267 Último mensaje 7 Septiembre 2015, 18:47 pm
por Bob1098
Duda con memoria dinamica
Programación C/C++
Ja_90 2 1,593 Último mensaje 20 Octubre 2015, 19:17 pm
por Ja_90
[C] (Consulta) Duda cuando un programa en C termina y memoria dinámica
Programación C/C++
class_OpenGL 4 2,099 Último mensaje 29 Mayo 2016, 21:19 pm
por class_OpenGL
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines