Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/10/2014, 09:00
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema con destructores y delete

Muy bien señalado por lareto.
El destructor es una función que se ejecuta automáticamente al cerrar el programa. No tienes por que llamarlo.
Pero si quieres liberar memoria te aconsejo que hagas una función freeMem() a la que puedas llamar cuando quieras y así puedes prescindir de usar el destructor. Pero no te olvides de liberar la memoria XD
Mire eso:
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class lol {
  5.     public:
  6.         lol(){ cout << "constructor llamado, se ha creado el objeto!" << endl; }
  7.         ~lol(){
  8.             cout << "Destructor llamado! Aqui se destruye automatico" << endl;
  9.             cin.ignore(); //Se va pausar para que puedas ver el mensaje antes de salir de main
  10.         }
  11.        
  12.     private:
  13.     //blabla bla bla!
  14. };
  15.  
  16. int main (){
  17.    
  18.     lol miLol;    //Crea el objeto
  19.    
  20.     cin.ignore(); // Pausa
  21.    
  22.     cout << "aqui debajo se va llamar automaticamente el destructor" << endl;
  23.     return 0;
  24. }

como buena practica de programación es asignar NULL al puntero después de liberar memoria, para que no haya problemas por una doble limpieza de memoria pues haz algo como:

Código C++:
Ver original
  1. ~C() {
  2.     if ( puntero != NULL ) {
  3.         delete [] puntero;
  4.         puntero = NULL; // ahora sabemos que apunta a NADA y podemos averiguar posteriormente.
  5.     }
  6. }

Con eso si ya habías llamado el destructor pues asigna NULL al puntero y cuando el destructor es llamado automáticamente al final va a ver que ya no apunta a nada y no va haber problemas XD

Te dejo la posible solución:
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5.  
  6. class C {
  7.         int * elem;
  8.     public:
  9.         C ( long n ) {
  10.             elem = new int [n];
  11.         }
  12.         ~C() {
  13.                 cout << "Destructor llamado"<<endl;
  14.             if ( elem != NULL ) {
  15.                 cout << "se ha liberado la memoria y elem apunta a NULL" <<endl;
  16.                 delete [] elem;
  17.                 elem = NULL;
  18.             }else{
  19.                 cout << "elem ya habia sido liberado previamente" << endl;
  20.             }
  21.         }
  22. };
  23.  
  24. int main() {
  25.     C a ( 5 );
  26.     a.~C();
  27.    
  28.     return 0;
  29. }


Última edición por vangodp; 22/10/2014 a las 09:13