Destructores

El destructor es muy similar al constructor, excepto que es llamado automáticamente cuando cada objeto sale de su ámbito de validez. Recordemos que las variables automáticas tienen un tiempo de vida limitado, ya que dejan de existir cuando se sale del bloque en que han sido declaradas. Cuando un objeto es liberado automáticamente, su destructor, si existe, es llamado automáticamente.
Un destructor tiene el mismo nombre que la clase a la que pertenece, pero precedido con una tilde (~). Un destructor no tiene tipo devuelto.
En el ejemplo anterior, podemos definir un destructor que asigne cero a las variables antes de que sean liberadas, con lo que en realidad no estamos haciendo nada:

# include <iostream.h>

class Caja {
    double longitud, anchura, altura;
  public:
    Caja (double dim1, double dim2, double dim3);
    ~Caja (void);
    double volumen (void);
};

Caja :: Caja (double dim1, double dim2, double dim3)
{
    longitud = dim1;
    anchura = dim2;
    altura = dim3;
};

Caja::~Caja (void) {     longitud = 0;     anchura = 0;     altura = 0; } double Caja:: volumen (void) {
    return longitud * anchura * altura;
};

main ()
{
   Caja pequeña(5, 4, 10), mediana (10, 6, 20), grande(20, 10, 30);

   cout << "El volumen de la caja grande es " << grande.volumen() << '\n';
}

Si algún bloque de memoria fuera reservada dinámicamente en un objeto, se puede utilizar el destructor para liberarla antes de que se pierdan los punteros a esas variables.

#include <iostream.h>

class Taco {
 public:
  Taco (int hard) {
    hardness = new int;
    *hardness = hard;
}
  ~Taco() {
    cout << "Destroying taco with hardness " ;
    cout << *hardness <<;\n';
    delete hardness;
}
 private:
  int *hardness; };

main ()
{
  Taco hard(10);
  Taco *soft = new Taco (0);

  delete soft;
};


En este ejemplo, vemos que el constructor tiene el mismo nombre que la clase, con un ~ delante. Cuando se crean punteros a clases, como soft en el ejemplo, se llama al destructor cuando se libera la memoria del puntero. Si esto no se hace, nunca se llamará al destructor.
Con clases declaradas estáticamente, como Taco hard, el destructor se llama al final de la función donde se declara el objeto (en el ejemplo, al final de la función main.
Incluse cuando se interrumpe un programa usando una llamada a exit(), se llama a los destructores de los objetos que existen en ese momento.

Free Web Hosting