Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema con Destructor

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema con Destructor Responder citando

Saludos a todos.... Espero les vaya muy bien...

Aqui yo con un problemita.... resulta que estoy creando una clase para una Pila de Numeros enteros, pero tengo un problema a la hora de destruir el objeto, ya que en el destructor, le indico que si le quedan elementos que los elimine todos....

Pero la cosa esta curiosa... porque si hay elementos, los destruye, pero no me marca el error al destruirlos, sino al terminar el programa, asi el objeto lo haya destruido muicho antes de finalizar el programa... Sin embargo, si el objeto cuando lo destruyo no tiene niongun elemento, no me marca ningun error.... ya intente borrar todos los elementos antes de destruir el objeto y de esta manera si me funciono.....

Hace tiempo recuerdo que quice hacer una Clase "cadena" al estilo la String o AnsiString, y recuerdo que me pasaba lo mismo, al intentar destruirla, marcaba un error en memoria.... aqui les pongo el codigo del destructor a ver si me pueden ayudar...

Código:


TPilaEntero::~TPilaEntero()
{
  try
    {
      TerminarTodo();
    }
  catch(...){};
}

void TPilaEntero::TerminarTodo()
{
   for(;Cantidad;)
      {
         piEliminar(0);
      }
}

void TPilaEntero::piEliminar(int Indice)
{
   TNodoEntero *aux,*anterior,*temp;
   aux=Inicio;
   anterior=Inicio;

  for(int i=0;i<Indice;i++)
     {
       anterior = aux;
       aux = aux->Siguiente;
     }
   temp = aux->Siguiente;
   if(aux==Inicio)
       Inicio = temp;
   else
       Tope = anterior;
   delete aux;
   anterior->Siguiente=temp;
}


Espero y alguien de uds pueda decirme que esta pasando.... no creo que sea error con el metodo de eliminacion, ya que como les digo, si borro los elementos manualmente, algo como esto:
Código:

for(;p.Cantidad;)
  p.Eliminar(0);

de esta manera no me marca ningun error, incluso el destructor al d4suitr el objeto no me marca error, sino al fiunalizar el programa... me pone e4l siguient eerror de memoria:

Cita:

The instruction at "0x356025a3" referenced memory at "0x00000004". The memory could not be "read"


Espero sinceramente que alguien sea capaz de ayudarme... se los agradeceria.... besos a todos... Very Happy
Volver arriba
Mensaje    Asunto: Responder citando

Podrias publicar el codigo del Constructor de tu Clase ? supongo que tienes claro que el destructor libera la memoria reservada ahi...

Si publicas el constructor seria mas facil ayudarte....

Saludos Wink
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Problema con Destructor Responder citando

Claro que si Viktor y muchas gracias por tu interes... EL codigo del Constructor es el siguiente:

Cita:

TPilaEntero::TPilaEntero()
{
Inicio=0;
Pila=0;
Tope=0;
intTotal=0;
}

En realidad a mi parecer creo que no hay nada especial ahi.. unicamente iniciarilizas valores... Donde Inicio, Pila y Tope son apuntadores de tipo TNodoEntero
Código:

      typedef struct TNodoEntero
        {
           int Elemento;
           TNodoEntero *Siguiente;
        }TNodoEntero;

e intTotal es unicamente un contador de tipo entero que me dice cuantos elementos he agregado a la pila... Very Happy
Volver arriba
Mensaje    Asunto: Responder citando

Hola de nuevo, a mi forma de ver (al menos como yo he programado siempre), si tienes que de alguna forma eliminar memoria que no ah sido reservada en el constructor de tu clase, (que ademas de ser un inicializador cumple esa funcion que es la mas importante tambien), quiere decir que tu clase esta mal diseñada...

Aun asi, a simple vista creo que el ciclo en la funcion piEliminar esta demas ya que si te fijas el valor que recibe Indice es 0 y luego en la condicion del for dices:

Código:
for(int i= 0;i<Indice;i++)
 {
  //Etc
 }


Por lo que la condicion no se cumple y no realiza lo del for...

Espero te sirva de algo... tal vez te fijas en algun error que no estas viendo con esto...

Saludos!
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Hola !

Has de cuenta que la clase que tengo, es como la ya famosa TStringList, pero para numerpos enteros, donde yo puedo agregar elementos a la lista y borrar el que yo quiera... la funcion piEliminar me elimina el elemento en la posicion que yo le indique y le disminuye en uno la propiedad Cantidad es por eso que:

Código:

for(;Cantidad;)
 {
    piEliminar(0);
  }


me elimina siempre el elemento en la posicion cero y disminuye cantidad, por lo que el cliclo se ejecuta mientras cantidad sea mayor que cero y todos los elementos se van recorriendo... ya intente de varias formas y no... utilizo esa funcio en el Destruictor apra no tenter quie escribir nuevamente un codigo de borrar y asi evitgar lineas.... te comento que si eso lo hago antes de destruir el objeto, es decir, borrar todos los elementos, si me funciona bien... voy a seguir tratando a ver que resulta.... muchas grcias de todas maneras por tu ayuda, se te agracdece
Volver arriba
Mensaje    Asunto: Responder citando

Ok, entiendo tu idea, pero aun asi, insisto, eso no lo deberias hacer en el destructor Razz

Haz de cuenta que tienes esta clase:

Código:
class MiClase
{
  public:
      char *sNombre;
      int nEdad;

      MiClase()
      {
        sNombre = new char[30];
      }
      ~MiClase()
      {
        delete[] sNombre;
      }

};


Al momento de crear una Instancia de tu clase :

Código:
MiClase Obj1 = new MiClase();

Habras reservado memoria para sNombre, y el destructor sera llamado solo cuando hagas :

Código:
delete Obj1;


No trato de dar una clase de POO sino que simplemente no se me ocurre de que otra forma explicarte, es decir si tienes por ejemplo un arreglo de esta clase:

Código:
MiClase Objs[30]


no basta con hacer esto si has reservado memoria para los 30

Código:
delete Objs;


para eliminar todo, me explico ???

Tal vez es el sueño que tengo el que me hace hablar tanto Wink

Ya, que me voy a dormir, son las 5:22 AM, nos vemos y suerte en eso...
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Entiendo perfectamente lo que tu me quieres decir Viktor, y agradezco mucho que te des el tiempo para esto....

Pero sucede que yo en el destructor no pued abrir espacio en memoria porque es hasta que empiece a agregar elementos cuando yo empiezo a apilar todos los elementos abriendoles sus respectivos espacios en memoria... Si me explico? y yo kiero al momento de destruir el objeto, verificar si hay elementos que nop fueron borrados, que se borren, porque si no se quedaran en memoria y seria un desperdicio en pocas palabras cuando yo hago esto:
Código:

TPila *p = new TPila();

ahi no puedo abrir espacio a los elementos, porke no si ni cuantos se agregaran ni nada por el estilo.. para eso utilizo el metodo
Código:

p->Agregar(x);

donde X es cualkier numero entero que yo kiero agregar y el cuerpo de este metodo es el siguiente:
Código:
void TPilaEntero::Agregar(long int _Numero)
{
   Tope = new TNodoEntero;
   Tope->Siguiente=0;
   Tope->Elemento=_Numero;
   if(intTotal==0)
     {
       Pila = Tope;
       Inicio = Tope;
     }
   else
     {
       Pila->Siguiente=Tope;
       Pila=Tope;
     }

   intTotal++;
}


Lo cual todo esto me funciona de maravilla, puedo borrar cualquier elemento y lo hace perfectamente.... pero el problema es a la hora de destruir el objeto, que intenta borrar los elementos que hayan quedado sin borrarse...

Hice modificaciones al destructor y lo deje de la siguiente manera:
Código:

TPilaEntero::~TPilaEntero()
{
     TNodoEntero *Siguiente;
     for(;intTotal;)
      {
         Siguiente = Inicio->Siguiente;
         delete Inicio;
         Inicio=Siguiente;
         intTotal--;
      }
}

y al parecer me ha funcionado a la perfeccion.... Laughing Gracias por tu ayuda Viktor en serio, espero no volver a tener prtoblemas con esto... Wink
Volver arriba
Mensaje    Asunto: Responder citando

Cita:

Pero sucede que yo en el destructor no pued abrir espacio en memoria


Disculpas, ahi en vez de destructor quice decir constructor, quizas tambien es el sueño jeje porke aki son las 12:34 am Embarassed
Volver arriba
Mensaje    Asunto: Responder citando

Esa version se ve mas correcta... Wink

Y no te preocupes que para eso estamos...
(Insisto, eso lo deberias haber hecho antes de que se llame al constructor, en el OnClose por ejemplo) Razz Razz Razz Razz

Y disculpa lo terco .... Wink
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Hola y not e preocupe,s no es terkedad sino qiue cada quien tiene su estilo....

Y lo que pasa es que no lo pudehaber usado en algun OnClose, porque de hecho no lol estoy usando con las VCL, ahorita lo estoy corriendo en una programa de ejemplo en modo consola,casi siempre me gusta programar de manera que me pueda servir con o sin las VCL, es por eso que tenia que hacerlo de esta manera...

Pero muchas gracias Viktor, que bien que este foro tenga gente que se preocupa en ayudarnos a los necesitados jejeje Embarassed
Volver arriba
Mensaje    Asunto: Responder citando

Pues no ahi de que Wink

Cita:
quizas tambien es el sueño jeje porke aki son las 12:34 am


No puedo evitar preguntar... donde estas ahora ? pq con España se que son aprox. 4 horas de diferencia con mi pais Chile...

Saludos!
_________________
"Ser inteligente no es ser mas, solo equivocarse menos y no usar Visual Basic"
Atte.
Victor Yañez

Apoyen el Proyecto OpenSource del Club Builder. Ya tenemos componentes Listos!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Yahoo Messenger MSN Messenger
Mensaje    Asunto: Responder citando

Soy de México Viktor, mas especificamente de Tijuana, Baja California, y en este momento entre Chile y la Ciudad de México existen 3 horas de diferencia... Pero como yo estoy en Baja California son 5 horas la de diferencia !!! Wink
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.