 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mar 02 Nov, 2004 11:49 am Asunto: Problemas con copia de objetos (memoria, destructores,...) |
|
|
Hola a todos.
Tengo un pequeño gran problema. A ver si logro explicarme. Tengo la clase OVigueta definida así:
| Código: | class OVigueta{
public:
char *Nombre,*Descripcion;
double Dim[9];
OVigueta();
~OVigueta();
};
OVigueta::OVigueta(){
Nombre=new char[200];
Descripcion=new char[200];
}
OVigueta::~OVigueta(){
delete[] Nombre;
delete[] Descripcion;
}
|
Luego quiero leer los datos de una serie de viguetas desde un archivo de texto. Como no sé cuántas voy a leer, utilizo una lista doble enlazada para almacenar provisionalmente el contenido de las viguetas.
| Código: | ...
OVigueta *Vig;
int nViguetas=0;
while(!archivo.eof()){
Vig=new OVigueta;
...
// Leo datos de la vigueta
...
// Guardo el objeto vigueta en la lista doble enlazada
ListaViguetas->GuardaObjeto(*Vig);
// Actualizo contador de viguetas
nViguetas++;
} |
Una vez leídas las viguetas las guardo definitivamente en un vector normal y corriente:
| Código: | OViguetas *vViguetas;
vViguetas=new OViguetas[nViguetas];
for(int i=0;i<nViguetas;i++)
vViguetas[i]=ListaViguetas->ValorObjeto(i); |
Y resulta que está mal. No me guarda los valores de las viguetas en el vector. He probado con constructores de copia y cosas así, y he visto que al guardar una vigueta en la lista de viguetas se llama al destructor del objeto, cuando no estoy destruyendo nada. Me voy a volver loco.
Necesito una ayuda.
Gracias y un saludo. Seguid bien. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 02 Nov, 2004 6:33 pm Asunto: |
|
|
Hola Cerúleo.
No has incluido el contenido de las funciones GuardaObjeto y ValorObjeto, que tal vez serían de ayuda a la hora de saber por qué te pasa esto.
De cualquier manera estás haciendo algo que a mí me resulta irregular: al llamar a GuardaObjeto le pasas *Vig, con lo que entiendo que estás guardando el valor de Vig y no el propio puntero al objeto.
Una posible solución para tu problema sería guardar en la lista no los valores, sino los propios punteros a los objetos. Me explico mejor con un ejemplo:
| Código: |
// Si tu función GuardarObjeto es como sigue:
void GuardarObjeto(OVigueta vig) {
//...
}
// Sustituye su cabecera por:
void GuardarObjeto(OVigueta *vig) {
//...
}
// De tal manera que al llamar a esta función lo hagas con:
ListaViguetas->GuardaObjeto(Vig);
|
La ventaja de guardar los punteros en lugar de los propios objetos es que te aseguras que el destructor sólo se invoque cuando tú hagas explícitamente "delete Vig;" y no simplemente con un cambio de contexto, que creo que es lo que está pasando. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Mar 02 Nov, 2004 7:25 pm Asunto: |
|
|
Hola masBecas. Gracias por contestar.
| Cita: | // Si tu función GuardarObjeto es como sigue:
void GuardarObjeto(OVigueta vig) {
//...
}
// Sustituye su cabecera por:
void GuardarObjeto(OVigueta *vig) {
//...
}
// De tal manera que al llamar a esta función lo hagas con:
ListaViguetas->GuardaObjeto(Vig);
|
Lo probaré, pero hasta el fin de semana no podré. Además pasa que el código de la lista doble enlazada lo tengo en un montón de módulos y voy a tener que retocar mogollón de código. Bueno, ya te contaré.
Un saludo.
P.D. Las funciones de la lista doble enlazada son muy sencillas:
| Código: | void GuardarObjeto(OVigueta vig) {
data=vig;
}
void ValorrObjeto(i) {
//Localiza elemento i...
return data;
} |
_________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
LordNemesis Master


Registrado: 31 Dic 2003Mensajes: 340Ubicación: México
|
Publicado: Mie 03 Nov, 2004 5:22 pm Asunto: |
|
|
Hola.... probablemente una de las razones de tu problema esta aqui....
| Código: | void GuardarObjeto(OVigueta vig) {
data=vig;
}
|
Lo que haces ahi, es pasar todas las referencias de vig a data, como estas usando punteros, se pasa nada mas la referencia y nmo los valores, y como al salir de la funcion GuardarObjeto, el parametro vig se elimina, es por eso qu et emanda llamar al constructor, entonces la referencia que le pasaste a data, ya estara destruida... lo que puedes hacer es bien como te dijeron anteriormente utilizar apuntadores, u otra solucion seria sobrecargar el operador de asignacion '=' para que te pase todos los elementos de un objeto al otro donde lo estas asignando, de esta manera tu problema se solucionara....
Saludos _________________ Dirección Municipal de Informática
H. Ayuntamiento de Tijuana
Arriba Lopez Obrador !!!
Los Mexicanos Merecemos Respeto !!! |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Dom 07 Nov, 2004 12:37 pm Asunto: |
|
|
Hola.
Muchas gracias a masBecas y a LordNemesis. Después de 12 horas modificando código he conseguido que funcione. Efectivamente, es mejor, más seguro y más cómodo trabajar con punteros.
Un saludo y seguid bien. Gracias de nuevo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| 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.
|