Qt verwendet, was sie nennen object trees und es ist ein bisschen anders vom typischen RAII-Ansatz.
Die QObject
Klasse constructor nimmt einen Zeiger auf ein Elternteil QObject
. Wenn dieses Elternteil QObject
zerstört wird, werden seine Kinder ebenfalls zerstört. Dies ist ein ziemlich weit verbreitetes Muster in Qt's Klassen und Sie werden bemerken, dass viele Konstruktoren einen *parent
Parameter akzeptieren.
Wenn Sie sich einige der Qt example programs ansehen, werden Sie feststellen, dass sie tatsächlich die meisten Qt-Objekte auf dem Heap konstruieren und diesen Objektbaum nutzen, um mit der Zerstörung umzugehen. Ich persönlich fand diese Strategie auch nützlich, da GUI-Objekte eine besondere Lebensdauer haben können.
Qt bietet keine zusätzlichen Garantien über C++ hinaus, wenn Sie nicht QObject
oder eine Unterklasse von QObject
(wie QWidget
) verwenden.
In Ihrem speziellen Beispiel gibt es keine Garantie, dass irgendetwas gelöscht wird.
Sie werden so etwas wie dies wollen für Des
(Des
vorausgesetzt, ist eine Unterklasse von 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
}
}
Und würden Sie Klasse Des
wie so verwenden:
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
}
das scheint sehr gut zu funktionieren. Vielen Dank. Aber wenn ich zum Beispiel 4 neue "test" -Widgets erstelle und sie wieder schließe, kostet das Erstellen eines weiteren "test" -widgets nicht mehr Speicher, aber die Anwendung verbraucht immer noch so viel Speicher wie die 4 "test" -Widgets würde noch existieren. Ist das normal? – Berschi
@Berschi, ist es möglich, dass entweder Qt oder Ihr Betriebssystem einige Speicheroptimierung durchführt.Wenn das fünfte Widget, das Sie in Ihrem Kommentar erwähnen, nicht mehr Speicher verwendet, würde ich mich nicht zu sehr darum kümmern. Eine andere Möglichkeit, wenn Sie betroffen sind, ist, ein Werkzeug wie valgrind zu finden und Ihr Programm durch es laufen zu lassen. –