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:
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):
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:
char* Cosa = new char[10];
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.