[C con Clase] Problema: Errores en el Compilador

Steven Davidson steven en conclase.net
Jue Dic 28 11:39:24 CET 2006


Hola David,

El pasado 2006-12-27 17:17:18, David Reza escribió:

DR> Muchas gracias ;).
DR> Solo creo que esto no me quedó totalmente claro. Si me equivoco por favor
DR> corríjanme:
DR> En C++, aparte de ser bueno, siempre hay que crear los objetos y eliminarlos
DR> después de haberlos utilizados explícitamente ya que en C++ no existen
DR> clases administradas?

Sí y no. Si te refieres a crear objetos dinámicamente, entonces sí; debemos liberar la memoria previamente creada. Como fuimos explícitos en su creación, debemos ser explícitos en su destrucción.

Al instanciar un objeto, bajo C++, podemos hacerlo como una variable regular. Por ejemplo,

class Algo {...};

Algo obj;

En este caso, el compilador es quien se encarga de crear la memoria necesaria al igual que destruirla cuando el objeto finalice su "vida"; o sea, cuando el flujo del programa se salga fuera del ámbito de 'obj'.

DR> Ultima duda: El Destructor sirve para ordenar la memoria utilizada por los
DR> objetos antes de que se eliminen pero, ¿Qué pasa si no utilizo el
DR> destructor? ¿Qué consecuencias tiene?

Esto depende de la implementación de la clase. Si no necesitas gestionar el objeto antes de ser destruido, entonces no necesitas un destructor. Por ejemplo,

class Algo
{
private:
  int n;
  float f;
  char cad[32];
  ...
};

Aquí no tenemos ningún problema si no implementamos un destructor, ya que al liberar la memoria de los datos miembros de cualquier objeto no tiene mayor consecuencia. Ahora bien, la siguiente clase sí debe tener un destructor implementado por nosotros.

class Otro
{
private:
  float *lista;
  int cant;

public:
  Otro( int n=10 ) : lista(0), cant(n)  { lista = new float[cant]; }
  ~Otro()  { delete[] lista; }
  ...
};

Al destruir cualquier objeto de la clase 'Otro', automáticamente se destruirá las variables miembros 'lista' y 'cant'. Como 'lista' es un puntero el cual es usado para guardar la dirección de memoria dada por el sistema al crear memoria dinámicamente, debemos liberar tal memoria. Tal liberación se hace a través del destructor, ya que no sabemos con exactitud cuándo tal memoria ya no será necesaria. A más tardar, liberaremos la memoria al destruirse el objeto. Si no tuviéramos tal destructor, entonces iríamos perdiendo o malgastando memoria, al no ser liberada nunca por nuestro programa.


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase