Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 17 Noviembre 2018, 18:34 pm



Título: [C++] Programa queda congelado al usar destructor
Publicado por: huchoko en 17 Noviembre 2018, 18:34 pm
Pues, siendo nuevo en C++ y ahora estoy con las clases, he estado experimentando con los destructores, pero por una razón que no sé, mi programa se queda congelado.
Acá mi código:
Código
  1. #include <iostream>
  2.  
  3. class doggo
  4. {
  5. private:
  6. std::string name, raza;
  7. public:
  8. doggo(std::string, std::string);
  9. ~doggo();
  10. void mdatos();
  11. void jugar();
  12. };
  13.  
  14. doggo::doggo(std::string _name, std::string _raza)
  15. {
  16. name = _name;
  17. raza = _raza;
  18. }
  19.  
  20. doggo::~doggo()
  21. {
  22. }
  23.  
  24. void doggo::mdatos()
  25. {
  26. std::cout << "Nombre: " << name << std::endl;
  27. std::cout << "Raza: " << raza << std::endl;
  28. }
  29.  
  30. void doggo::jugar()
  31. {
  32. std::cout << "El perro esta jugando" << std::endl;
  33. }
  34.  
  35. int main()
  36. {
  37. doggo perro1("fido", "normal");
  38. perro1.mdatos();
  39. perro1.jugar();
  40. perro1.~doggo(); //objdes
  41. std::cout << "\n";
  42. return 0;
  43. }
  44.  
Saludos  :)


Título: Re: [C++] Programa queda congelado al usar destructor
Publicado por: CalgaryCorpus en 17 Noviembre 2018, 19:00 pm
Elimina la invocacion del destructor explicita. Deja que el objeto se destruya solo al morir el programa.


Título: Re: [C++] Programa queda congelado al usar destructor
Publicado por: K-YreX en 17 Noviembre 2018, 23:26 pm
Elimina la invocacion del destructor explicita. Deja que el objeto se destruya solo al morir el programa.
Exacto como bien te han explicado ahí no debes escribir:
Código
  1. perro1.~doggo();
Ya que el destructor de una clase se invoca automáticamente al terminar el programa. Además en los casos en que no usas memoria dinámica no es necesario definir el destructor ya que la clase proporciona uno por defecto (como ocurre con el constructor). En cambio si utilizas memoria dinámica, en el destructor tendrías que liberar esa memoria ya que sino el programa correrá aparentemente sin problemas pero estarás dejando memoria sin liberar.

¿Entonces si quieres aplicar el destructor explícitamente durante el programa? Muy sencillo, creas un método auxiliar con las instrucciones del destructor y en el destructor sólo llamas a ese método auxiliar. Así si quieres usarlo en otro punto del programa sólo deberás invocar al método auxiliar. Pero recuerda, si invocas el método auxiliar por ejemplo para liberar memoria dinámica, tendrás que volver a reservar memoria antes de llegar al final y de que se llame al destructor; sino estarás liberando dos veces la memoria y la segunda vez te producirá un error.

Código
  1. Doggo::miDestructor(){
  2.    // instrucciones del destructor
  3. }
  4.  
  5. Doggo::~Doggo(){
  6.    miDestructor;
  7. }
  8.  
  9. int main(){
  10.    Doggo perro1;
  11.    // otras instrucciones del programa
  12.    perro1.miDestructor();
  13.    // otras instrucciones del programa
  14.    return 0;  // se llama automaticamente a ~Doggo()
  15. }

Aunque estás empezando ya llegarás a trabajar con memoria dinámica por lo que ten presente esto. Ánimo.