BUSCAR
INDICE
INDICE DEL TEMA
OBJETIVOS
TEORIA
PALABRAS RESERVADAS
GLOSARIO
EJERCICIOS
RESUELTOS
AUTOEVALUACION
PROPUESTOS
ERRORES
ESTADISTICAS
INICIO
FAQS
LINKS
RECOMIENDANOS
QUIENES SOMOS
MAPA DEL WEB
COLABORAR
Tema 18 Clases: Definiciones
Teoría: Operadores new y delete con clases

Los operadores new y delete pueden ser aplicados tanto a variables de los tipos predefinidos (int, float, double, …) como a objetos de las clases definidas por el usuario. Su principal aplicación está en la creación de variables con reserva dinámica de memoria, sustituyendo a las funciones calloc(), malloc() y free() que se utilizan en C.

Una vez creada la clase C_Cuenta, una sentencia del tipo:

C_Cuenta *c1 = new C_Cuenta;

supone una operación en tres fases:

1. En primer lugar se crea un puntero c1 capaz de contener la dirección de un objeto de la clase.

2. A continuación, por medio del operador new se reserva memoria para un objeto del tipo C_Cuenta.

3. Finalmente se llama, de modo transparente al usuario, a un constructor de la clase C_Cuenta.

Los constructores son funciones que se llaman automáticamente al crear un objeto de una clase. Su misión es dar un valor inicial a todas las variables miembro, de modo que no haya nunca objetos con variables sin un valor apropiado (conteniendo basura informática). Los constructores se explican en el apartado siguiente. El operador new se puede utilizar para crear vectores de objetos con reserva dinámica de memoria, en la forma:

C_Cuenta *ctas = new C_Cuenta[100];

La diferencia fundamental entre new y delete por una parte, y malloc() y free() por otra es que los primeros crean y destruyen objetos, mientras que los segundos se limitan a reservar y liberar zonas de memoria. Además hay que tener en cuenta que new puede ser sobrecargado como cualquier otro operador, con las ventajas de simplificación de código que ello supone. La sobrecarga de operadores se estudiará en un apartado posterior.

Al utilizar delete (lo mismo sucede con free()), se libera la zona de memoria a la que apunta, pero sin borrar el propio puntero. Si se manda liberar lo apuntado por un puntero nulo no pasa nada especial y el programa no libera memoria. Sin embargo si se ordena liberar dos veces lo apuntadopor un puntero las consecuencias son imprevisibles y puede que incluso catastróficas, por lo que es importante evitar este tipo de errores.

En el caso de que se desee liberar la memoria ocupada por un vector creado mediante reserva dinámica de memoria debe emplearse una instrucción del tipo:

delete [] ctas;

siendo ctas el puntero al primer elemento del vector (el puntero que recogió el valor de retorno de new).