 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 8:26 am Asunto: Problema con Destructor |
|
|
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...  |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Dom 01 Feb, 2004 8:32 am Asunto: |
|
|
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  _________________ "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 |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 8:46 am Asunto: Problema con Destructor |
|
|
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...  |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Dom 01 Feb, 2004 8:57 am Asunto: |
|
|
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 |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 9:09 am Asunto: |
|
|
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 |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Dom 01 Feb, 2004 9:25 am Asunto: |
|
|
Ok, entiendo tu idea, pero aun asi, insisto, eso no lo deberias hacer en el destructor
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 :
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:
no basta con hacer esto si has reservado memoria para los 30
para eliminar todo, me explico ???
Tal vez es el sueño que tengo el que me hace hablar tanto
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 |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 9:34 am Asunto: |
|
|
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
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.... Gracias por tu ayuda Viktor en serio, espero no volver a tener prtoblemas con esto...  |
|
| Volver arriba |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 9:35 am Asunto: |
|
|
| 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  |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Dom 01 Feb, 2004 9:38 am Asunto: |
|
|
Esa version se ve mas correcta...
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)
Y disculpa lo terco ....  _________________ "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 |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 9:45 am Asunto: |
|
|
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  |
|
| Volver arriba |
|
 |
_Viktor Master


Registrado: 20 Jul 2003Mensajes: 463Ubicación: Santiago, Los Angeles - Chile
|
Publicado: Dom 01 Feb, 2004 9:49 am Asunto: |
|
|
Pues no ahi de que
| 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 |
|
 |
Vanessa Invitado
|
Publicado: Dom 01 Feb, 2004 8:57 pm Asunto: |
|
|
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 !!!  |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|