elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Destructor se ejecuta bien pero da error al final de la ejecución [SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Destructor se ejecuta bien pero da error al final de la ejecución [SOLUCIONADO]  (Leído 3,039 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Destructor se ejecuta bien pero da error al final de la ejecución [SOLUCIONADO]
« en: 25 Abril 2013, 14:05 pm »

Hola a todos.

Tengo una clase plantilla que como atributos tiene una matriz (T **m) y 2 enteros
(int m, int n). (Defino así la matriz porque si no el compilador me da fallo, creo que por el parámetro, tampoco me deja haciendo T *x[])
He leído que para clases que tienen atributos que son mas complejos que vectores (matrices, grafos etc) hay que definir el destructor porque éste por si solo no sabe que hacer ante dichas estructuras.
El caso es que lo estoy intentando implementar pero haga lo que haga siempre me da error, esto lo que he hecho, y no entiendo por qué no funciona:

Código:
private:
      T **x;
      int m,n;
      //.......
      //.......
public:
       A::~A()
      //.......
      //.......
template <class T>
A::~A(){
for(int i=0;i<this->m;i++){
delete[](this->x[i]);
}
delete[]this->x;
delete& this->m;
delete& this->n;
}

¿Como habría que hacerlo?

Muchas gracias.


« Última modificación: 25 Abril 2013, 16:01 pm por SARGE553413 » En línea

NoLife

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Ayuda: no entiendo bien los destructores.
« Respuesta #1 en: 25 Abril 2013, 14:55 pm »

bueno, esta es la sintaxis básica del constructor y destructor:

class A
{
public:
       // Constructor
       A()
       {
            // codigo
       }
      
       // Destructor
       ~A()
       {
            //codigo: de lo usual para liberar espacio reservado en memoria.
       }

};

Creo que basicamente tu problema es el operador de resolucion( : : ), que estas usandolo incorrectamente. El Operador de resolucion es para hacer llamados, por ejemplo: A::E(): significa que llamas a la funcion E en el contexto A.


« Última modificación: 25 Abril 2013, 15:12 pm por NoLife » En línea

“Cualquier tonto puede escribir código que la PC entienda. Los buenos programadores escriben código que los humanos pueden entender.” – Martin Fowler
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Ayuda: no entiendo bien los destructores.
« Respuesta #2 en: 25 Abril 2013, 15:21 pm »

Pero si utilizas fichero de cabecera *.h y de codigo fuente *.cpp tienes que usar el operador de ámbito en el código fuente.

De todas formas probaré, vuelvo y escribo.


EDITO.

Si, si quito el operador de ámbito el compilador me dice que estoy declarando el método como no miembro.

Voy a clarificar la estructura del documento, está todo en un *.h porque si lo haces por separado no puedes usar templates:

Código:
#ifndef A_H
#define A_H 1

template <class T>
class A{
//atributos
   private: ...
//delcaración de métodos
   public:....
};

#endif

template <class T>
A::~A(){
   //codigo descrito arriva
}

//resto de métodos
...
...

Nota: lo mas acojonante es que si dejo el destructor vacío (sin código), al intentar hacer delete a un objeto clase A, me salta el mismo error siempre.
El error es, haga lo que haga el destructor, termina, porque escribo
cout<<"1"<<endl;' al principio y 'cout<<2..' al final y salen por pantalla los 2, el error es que el programa "no responde" justo antes de hacer el 'return 0' del main.

Nota2: he probado a declarar un puntero normal y hacerle delete y en ese caso el destructor si funciona bien.
Entonces pregunto, como se define un destructor de matrices, y saber si tenemos una clase con punteros y con variables normales, el destructor debe destruir solo los punteros, o también las variables normales.
« Última modificación: 25 Abril 2013, 15:44 pm por SARGE553413 » En línea

NoLife

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Ayuda: no entiendo bien los destructores.
« Respuesta #3 en: 25 Abril 2013, 15:46 pm »

bueno, si tampoco eso funciono... espero te ayude otro. yo soy algo nuevo. saludos. hehe
En línea

“Cualquier tonto puede escribir código que la PC entienda. Los buenos programadores escriben código que los humanos pueden entender.” – Martin Fowler
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Ayuda: no entiendo bien los destructores.
« Respuesta #4 en: 25 Abril 2013, 15:52 pm »

Gracias de todas formas :)
En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Re: Ayuda: no entiendo bien los destructores.
« Respuesta #5 en: 25 Abril 2013, 16:00 pm »

Vale he encontrado el problema.

Resulta que el objeto clase A lo había declarado "no puntero", como el compilador me decía que delete está esperando puntero le paso la dirección de memoria del objeto, es decir:
Código:
...
A a(5);
delete &a;
....

Si declaro un puntero no me da ese problema, y creo que se por qué:

Al declararse 'a' como objeto "no puntero" no es persistente, es decir, al terminar el método main se destruye automáticamente. Por tanto, si hacemos 'delete &a', está bien hecho, el problema es que al terminar el main automáticamente se llama a los destructores de objetos para ser borrados.
Por eso mi destructor funcionaba bien, pero sin yo saberlo, esta siendo llamado 2 veces para detruir el mismo objeto.
Ahora he puesto en cuerpo del destruc. 'cout<<"Destructor"<<endl', he declarado 2 objetos a, y *b (puntero), he hecho solo delete al b (habiéndolo construido previamente claro) y he comprobado que el destructor es llamado 2 veces, explícitamente para b e implícitamente para a.
Solucionado, espero le sirva a alguien.
Saludos.

PD. si alguien me dice como poner spoiler en este foro, subo todo el código (main y clase) para que lo veáis.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compila bien, pero no ejecuta !! Solucionado
Java
Vingilot 4 3,975 Último mensaje 8 Enero 2008, 15:20 pm
por Vingilot
Que hago mal? compilar pero no ejecuta bien
Programación C/C++
roser24 9 3,706 Último mensaje 5 Mayo 2010, 22:43 pm
por Littlehorse
compila y ejecuta bien, pero me muestra un caracter raro
Programación C/C++
pedroarcego 7 3,948 Último mensaje 7 Septiembre 2010, 11:28 am
por Garfield07
Codigo php no se ejecuta bien en IE pero en chrome y firefox si !!!
Desarrollo Web
HDS02 1 5,125 Último mensaje 1 Enero 2011, 00:34 am
por WHK
error en python corre bien pero marca error
Scripting
Joe Fraddy 3 2,628 Último mensaje 25 Agosto 2015, 19:06 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines