Ver Mensaje Individual
  #2 (permalink)  
Antiguo 31/05/2014, 05:43
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Mi cadena se pierde

La verdad no tengo ni idea pero estas decindo que imprima cadena y cadena ya no existe asi que creo que el compilador ya no sabe como tomar eso te lo imprime cosas raras por que ya no tiene ni tipo ni valor.

lo malo que veo a tu código es que creo que estas cometiendo un error.
Mira este constructor bien...
Código C++:
Ver original
  1. cadena::cadena(const char *LCad)
  2. {  
  3.     cad = new char[strlen(LCad) + 1];
  4.     strcpy(cad, LCad);
  5.     cout << "Constructor de " << cad << "\n";
  6. }
ahora fiate en main.
Código C++:
Ver original
  1. int main()
  2. {
  3.     cadena cadenita("Hola");
  4.     cadenita = "Adios";
  5.    
  6.     return 0;
  7. }
sa salida es:
Código txt:
Ver original
  1. Constructor de Hola
  2. Constructor de Adios
  3. Destructor de ÿ↕:
  4. Destructor de ÿ↕:
  5.  
  6. Process returned 0 (0x0)   execution time : 0.083 s
  7. Press any key to continue.

Si llamas a este constructor: cadena cadenita("Hola");
Estas haciendo: cad = new char[strlen(LCad) + 1];
Estas creando un espacio en memoria y asignandolo a cad ¿correcto?...
Luego llamas otra vez al constructor aquí: cadenita = "Adios";
Por lo que otra vez haces: cad = new char[strlen(LCad) + 1];

O sea creas 2 espacios de memoria y los asignas a cad. Solo los liberas al final cuando termina main es cuando se llama los destructores.

¿No crees que antes de llamar al constructor por segunda vez deberías liberar la memoria?
Te lo digo por que a mi me parece que estas teniendo fuga de memoria. No estoy seguro 100% pero me parece que tras un new debes llamar un delete si pretendes asignar una nueva variable en el heap a cad, y debes liberar la variable anterior antes. Es solo impresión mía o no lo se, a ver si alguien mas lo confirma.
Cuidado con eso :O

Creo que debes llamar al destructor antes de llamar al constructor nuevamente pero ahi tendrias que crear un nuevo objeto, lo mejor seria hacer una función que liberase la memoria antes de llamarlo nuevamente.

Última edición por vangodp; 31/05/2014 a las 05:49