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 

Problemas con copia de objetos (memoria, destructores,...)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problemas con copia de objetos (memoria, destructores,...) Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
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.