Qt utiliza lo que ellos llaman object trees y es un poco diferente desde el enfoque típico de RAII.
La QObject
clase constructor toma un puntero a uno de los padres QObject
. Cuando ese padre QObject
se destruye, sus hijos también serán destruidos. Este es un patrón muy común en las clases de Qt y notará que muchos constructores aceptan un parámetro *parent
.
Si observa alguno de los Qt example programs, descubrirá que realmente construyen la mayoría de los objetos Qt en el montón y aprovechan este árbol de objetos para manejar la destrucción. Personalmente, también encontré esta estrategia útil, ya que los objetos de la GUI pueden tener vidas peculiares.
Qt no ofrece garantías adicionales más allá de C++ estándar si no está usando QObject
o una subclase de QObject
(como QWidget
).
En su ejemplo particular, no hay garantía de que se elimine algo.
Usted querrá algo como esto por Des
(suponiendo Des
es una subclase de QWidget
):
class Des : public QWidget
{
Q_OBJECT
public:
Des(QWidget* parent)
: QWidget(parent)
{
QPushButton* push = new QPushButton("neu");
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(push); // this re-parents push so layout
// is the parent of push
setLayout(layout);
}
~Des()
{
// empty, since when Des is destroyed, all its children (in Qt terms)
// will be destroyed as well
}
}
Y tendrá que utilizar la clase Des
así:
int someFunction()
{
// on the heap
Des* test = new Des(parent); // where parent is a QWidget*
test->show();
...
// test will be destroyed when its parent is destroyed
// or on the stack
Des foo(0);
foo.show();
...
// foo will fall out of scope and get deleted
}
esto parece funcionar muy bien. Gracias. Pero cuando creo 4 nuevos widgets "de prueba" por ejemplo y los vuelvo a cerrar, crear otro widget "de prueba" no costará más memoria, pero la aplicación aún usa tanto como memoria como cuando los 4 "widgets de prueba" todavía existiría. ¿Eso es normal? – Berschi
@Berschi, es posible que Qt o su SO esté optimizando la memoria.Si el quinto widget que mencionas en tu comentario no causa que se use más memoria, no me preocuparía demasiado. Otra opción, si está preocupado, es encontrar una herramienta como valgrind y ejecutar su programa a través de ella. –