Curso de C++ (Página 14b)

pagina014a Principal pagina015

CAPITULO 14b Operadores II: Más operadores

Operadores de manejo de memoria "new" y "delete"

Veremos su uso en el capítulo de punteros II y en mayor profundidad en el capítulo de clases y en operadores sobrecargados.

Operador new:

El operador new sirve para reservar memoria dinámica.

Sintaxis:

[::] new [<emplazamiento>] <nombre de tipo> [(<inicialización>)]

[::] new [<emplazamiento>] (<nombre de tipo>) [(<inicialización>)]

[::] new [<emplazamiento>] <nombre de tipo>[<número de elementos>]

[::] new [<emplazamiento>] (<nombre de tipo>)[<número de elementos>]

El operador opcional :: está relacionado con la sobrecarga de operadores, de momento no lo usaremos. Lo mismo se aplica a emplazamiento.

La inicialización, si aparece, se usará para asignar valores iniciales a la memoria reservada con new, pero no puede ser usada con arrays.

Las formas tercera y cuarta se usan para reservar memoria para arrays dinámicas. La de la memoria reservada con new será válida hasta que se libere con delete o hasta el fin del programa. Aunque es aconsejable liberar siempre la memoria reservada con new usando delete. Se considera una práctica sospechosa no hacerlo.

Si la reserva de memoria no tuvo éxito, new devuelve un puntero nulo, NULL.

Operador delete:

El operador delete se usa para liberar la memoria dinámica reservada con new.

Sintaxis: [::]

delete [<expresión>]

[::] delete[] [<expresión>]

La expresión será normalmente un puntero, el operador delete[] se usa para liberar memoria de arrays dinámicas.

Es importante liberar siempre usando delete la memoria reservada con new. Existe el peligro de pérdida de memoria si se ignora esta regla (memory leaks).

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.

Nota: los operadores new y delete son propios de C++. En C se usan las funciones malloc y free para reservar y liberar memoria dinámica y liberar un puntero nulo con free suele tener consecuencias desastrosas.

Veamos algunos ejemplos:

int main() { 
   char *c; 
   int *i = NULL; 
   float **f; 
   int n;
 
   c = new char[123]; // Cadena de 122 caracteres 
   f = new (float *)[10]; // Array de 10 punteros a float 
   for(n = 0; n < 10; n++) f[n] = new float[10]; // Cada elemento del array es un array de 10 float 
   // f es un array de 10*10 
   f[0][0] = 10.32; 
   f[9][9] = 21.39; 
   c[0] = 'a'; 
   c[1] = 0; 
   // liberar memoria dinámica
   for(n = 0; n < 10; n++) delete[] f[n]; 
   delete[] f; 
   delete[] c; 
   delete i; 
   return 0; 
}

pagina014a Principal pagina015