Académique Documents
Professionnel Documents
Culture Documents
Para crear y mantener estructuras dinámicas de datos se requiere la asignación dinámica de memoria, la cual
permite que un programa obtenga más memoria en tiempo de ejecución, para almacenar nuevos nodos.
Cuando el programa ya no necesita la memoria, esta se puede liberar para que se pueda reutilizar al asignar
otros objetos en el futuro. El límite para la asignación dinámica de memoria puede ser tan grande como la
cantidad de memoria física disponible en la computadora, o la cantidad de memoria virtual disponible en un
sistema con memoria virtual.
Tambien se puede decir que la asignación de memoria dinámica significa que la reserva de memoria se realiza
dinámicamente en tiempo de ejecución, no siendo necesario entonces tener que especificar en la declaración
de variables la cantidad de memoria que se va a requerir. La reserva de memoria dinámica añade una gran
flexibilidad a los programas porque permite al programador la posibilidad de reservar la cantidad de memoria
exacta en el preciso instante en el que se necesite, sin tener que realizar una reserva por exceso en prevención
a la que pueda llegar a necesitar.
A menudo, los limites son mucho mas pequeños ya que la memoria disponible en la computadora debe
compartirse entre muchos programas.
La asignación dinámica de memoria de un objeto existe hasta que es liberada explícitamente por el
programador, o por la salida de un bloque o por el recolector de basura. En este contexto, se dice que ese
objeto tiene tiempo de vida dinámico.
El operador new recibe como argumento el tipo de objeto que se va a asignar en la forma dinámica y
devuelve un apuntador a un objeto de este tipo. También la memoria reservada de forma dinámica suele estar
alojada en el heap o almacenamiento libre, y la memoria estática en el stack o pila (con excepción de los
objetos de duración estática, los cuales suelen colocarse en una zona estática de datos). La pila suele ser una
zona muy limitada. El heap, en cambio, en principio podría estar limitado por la cantidad de memoria
dinámica.
Generalmente la memoria es asignada desde una gran pool o memoria sin usar, llamada heap. La ubicación
exacta de la memoria asignada no es conocida, por lo tanto esa memoria es accedida indirectamente,
generalmente vía referencia.
Sabiendo esto sobre las funciones en C pasemos a C++ que ofrece un nuevo y mejor método para gestionar la
asignación dinámica de memoria, los operadores new y delete, que asignan y liberan la memoria de una zona
de memoria llamada almacén libre.
Los operadores new y delete son más versátiles que maloc() y free(), ya que ellos pueden asociar la
asignación de memoria con el medio que lo utiliza. Son más fiables, ya que el compilador realiza verificación
de tipos cada vez que un programa asigna memoria con new.
Otra ventaja proviene del hecho de que new y delete se implementan como operadores y no como funciones.
Esto significa que new y delete se construyen en el propio lenguaje de modo que los programas pueden
utilizar new y delete sin incluir ningún archivo de cabecera.
Existe otra característica importantes de los operadores new y delete y es que ellos nunca requieren moldeado
(conversión forzosa de tipos) de tipos y eso hace que new y delete más fáciles de utilizar que malloc() y
free().
Los objetos creados con new residen en el almacenamiento libre. Los objetos del almacenamiento libre se
eliminan con el operador delete.
Operador delete:
Cuando se ha terminado de utilizar un bloque de memoria previamente asignado por new, se puede liberar el
espacio de memoria y dejarlo disponible para otros usos, mediante el operador delete.
El bloque de memoria suprimido se devuelve al espacio de almacenamiento libre, de modo que habrá más
memoria disponible para asignar otros bloques de memoria. La expresión será normalmente un puntero, el
operador delete[] se usa para liberar memoria de arrays dinámicos.
Es importante liberar siempre usando delete la memoria reservada con new. Existe el peligro de pérdida de
memoria si se ignora esta regla. Cuando se usa el operador delete con un puntero nulo, no se realiza ninguna
acción. Esto permite usar el operador delete con punteros sin necesidad de preguntar si es nulo antes.
De todos modos, es buena idea asignar el valor 0 a los punteros que no han sido inicializados y a los que han
sido liberados. También es bueno preguntar si un puntero es nulo antes de intentar liberar la memoria
dinámica que le fue asignada.
EJEMPLOS
Operador new:
# include <iostream.h>
#include <string.h> // uso de strcpy()
Void main()
{
Char*cad = “Sierras de Cazorla, Segura y Magina”;
Int lon = strlen(cad);
Char *ptr;
ptr = new char[lon+1];
Cout << endl << “ptr = “ << ptr; // cad esta ahora en ptr
Operador delete:
#include <iostream.h>
#include <string.h>
Char *p;
p = new char[80];
cout <<p<<endl;
delete p;
c = new char[123];
f[0][0] = 10.32;
f[9][9] = 21.39;
c[0] = 'a';
c[1] = 0;