Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] QT: objeto no se destruye

Estas en el tema de QT: objeto no se destruye en el foro de C/C++ en Foros del Web. Hola Estoy teniendo un problema con la destrucción de un objeto que creo en el main y que en determinadas circunstancias, no se destruye, un ...
  #1 (permalink)  
Antiguo 14/04/2015, 05:56
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
QT: objeto no se destruye

Hola

Estoy teniendo un problema con la destrucción de un objeto que creo en el main y que en determinadas circunstancias, no se destruye, un poco de código para ver:

El main:

Código C++:
Ver original
  1. int main(int argc, char *argv[])
  2. {
  3.     QApplication a(argc, argv);
  4.  
  5.     // más código aquí
  6.  
  7.     // el objeto en cuestion es éste:
  8.     Configuracion config(carpetaDatos + QDir::separator() + "cfg.ini");
  9.    
  10.     // más código aquí
  11.  
  12.     // abrir la ventana principal, que le paso el objeto creado anteriormente
  13.     MainWindow w(&config);
  14.     w.show();
  15.  
  16.     return a.exec();
  17. }

El constructor del MainWindow es así:

Código C++:
Ver original
  1. MainWindow::MainWindow(Configuracion *cfg, QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow),
  2.     config(cfg)
  3.     // config es un puntero a Configuracion
  4. {
  5.     ui->setupUi(this);
  6.    
  7.     // más código aquí
  8. }

Y en el destructor de Configuración he puesto que me imprima un mensaje:

Código C++:
Ver original
  1. Configuracion::~Configuracion()
  2. {
  3.     qDebug() << "Configuracion destruida";
  4. }

En la ventana tengo un QPushButton y un QAction, ambos conectados con el SLOT "close()" del QMainWindow y todo funciona, cuando cierro la ventana por alguno de esos dos opciones o pulsando el botón "X", aparece el mensaje de "Configuración destruida".

Ahora bien, tengo puesto un QChechBox, que si está marcado, cuando termina de imprimir, cierra el programa, esto lo tengo hecho de la siguiente forma:

Código C++:
Ver original
  1. // salir si se marcó la casilla
  2. if(ui->chSalir->isChecked()) this->close();
Pues bien, la ventana se cierra, pero el objeto Configuracion no se destruye. Esto solo me ocurre desde windows, he probado con linux y no ocurre.

¿Debo hacer ésto de otra forma?

Un saludo
  #2 (permalink)  
Antiguo 14/04/2015, 06:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: QT: objeto no se destruye

qDebug no es un objeto fiable en estas circunstancias. Lo que hace qDebug es habilitarte un buffer en el que puedes volcar información de depuración. Lo que está sucendiendo es que, en el caso de Windows (posiblemente debido al compilador), se está destruyendo el buffer de qDebug antes de ejecutar la destrucción del objeto que comentas.

Puedes probar a cambiar qDebug por std::cout y comprobar si sale o no el nombre del destructor.

Por cierto, un objeto que está en la pila (como es tu caso) se va a destruir sí o sí en el momento en el que la ejecución salga del ámbito del objeto. Es una diferencia fundamental con respecto a los objetos ubicados en el heap o memoria dinámica, que no se destruyen hasta que no das la orden explícita. En este caso, la única explicación para que el objeto no se destruyese es que el programa sigue en ejecución.

Un saludo.
  #3 (permalink)  
Antiguo 14/04/2015, 08:54
Avatar de jc_moj  
Fecha de Ingreso: septiembre-2009
Ubicación: Andalucía
Mensajes: 137
Antigüedad: 14 años, 7 meses
Puntos: 12
Respuesta: QT: objeto no se destruye

Hola

Cita:
Iniciado por eferion Ver Mensaje
... Lo que está sucendiendo es que, en el caso de Windows (posiblemente debido al compilador), se está destruyendo el buffer de qDebug antes de ejecutar la destrucción del objeto que comentas.
Exactamente ese era el problema, he añadido junto a qDebug() otra línea que imprima otro mensaje con std::cout y éste sí se imprime, mientras el de qDebug() no.

Por cierto, el compilador, MinGW.

Cita:
Iniciado por eferion Ver Mensaje
... un objeto que está en la pila (como es tu caso) se va a destruir sí o sí en el momento en el que la ejecución salga del ámbito del objeto...

... la única explicación para que el objeto no se destruyese es que el programa sigue en ejecución.
Por eso me extrañaba, ya que al parecer, el programa sí finalizaba su ejecución.

Un saludo

Etiquetas: char, funcion, int, objeto, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:59.