[C con Clase] Como liberar memoria estatica?

Steven Davidson steven en conclase.net
Jue Ago 9 18:34:04 CEST 2007


Hola Ferrán,

El pasado 2007-08-09 13:40:12, Ferran Ferri escribió:

FF> hola a todos:
FF> tengo una duda acerca de las varaibles static: tengo una clase con una
FF> variable static que es un puntero. Al inicializarla, uso el new y le asigno
FF> memoria. El problema viene cuando llega el momento de finalizar la
FF> aplicacion. Como deberia liberar la memoria justo cuando finalice la ultima
FF> instancia de mi clase? Es decir: si la libero en el destructor de una
FF> instancia deberia usar un contador de instancias, si la libero en el
FF> atexit() quizas esa funcion no sea llamada en el momento necesario o
FF> simplemente se produzca una salda inesperada. Tambien he pensado en un
FF> destructor estatico... pero no tengo muy claro cual es la mejor opcion.
FF> Existe alguna metodologia para hacer esto?

Sospecho que quieres usar una variable estática miembro de una clase para ser compartida por todas las instancias. Si es así, entonces puedes optar por una u otra opción. Si usas el destructor, entonces tienes que comprobar que un destructor previo no ha liberado la memoria. Por ejemplo,

class Algo
{
private:
  int dato;
  static float *pLista;

public:
  ~Algo()
  {
    if( pLista )
    {
      delete pLista;
      pLista = 0;
    }
  }
  ...
};

De esta manera, cada destructor comprueba si es un puntero nulo o no en lugar de liberar la memoria directamente.


Si usas la variable miembro estática por motivos de diseño, entonces sugiero manipularla fuera de la clase. Por ejemplo, en 'main()' o como has mencionado, podrías usar 'atexit()' como "destructor".

Recuerda que las variables miembro estáticas no pertenecen a las instancias y por tanto pueden ser manipuladas externamente a la clase, al menos que no haya permiso de hacerse, como en el ejemplo anterior: 'pLista' es privada.


Espero haber aclarado las dudas.

Steven


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