Qt wykorzystuje to, co nazywają object trees i jest to nieco inna z typowego podejścia RAII.
QObject
klasa constructor przenosi wskaźnik do rodzica QObject
. Kiedy ten rodzic QObject
zostanie zniszczony, jego dzieci również zostaną zniszczone. Jest to dość powszechny wzorzec w klasach Qt, a zauważysz, że wielu konstruktorów akceptuje parametr *parent
.
Jeśli spojrzysz na niektóre z Qt example programs zobaczysz, że faktycznie konstruują większość obiektów Qt na stercie i wykorzystują to drzewo obiektów do radzenia sobie z niszczeniem. Osobiście uważam, że ta strategia jest również przydatna, ponieważ obiekty GUI mogą mieć osobliwe czasy życia.
Qt nie zapewnia żadnych dodatkowych gwarancji poza standardowym C++, jeśli nie używasz QObject
lub podklasy QObject
(na przykład QWidget
).
W tym konkretnym przypadku nie ma gwarancji, że coś zostanie usunięte.
Będziesz chciał coś takiego dla Des
(zakładając Des
jest podklasą 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
}
}
I byłoby użyć klasy Des
tak:
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
}
to wydaje się działać bardzo dobrze. dzięki. Kiedy jednak utworzę 4 nowe "testowe" -widgety i ponownie je zamknę, utworzenie kolejnego "testowego" -widgeta nie będzie kosztować więcej pamięci, ale aplikacja nadal zużywa tyle samo pamięci, co w przypadku 4-testowych -widgetów nadal by istniało. Czy to normalne? – Berschi
@Berschi, możliwe, że albo Qt, albo twój system operacyjny, robi trochę optymalizacji pamięci.Jeśli piąty widżet, o którym wspomniałeś w swoim komentarzu, nie powoduje więcej pamięci, nie martwiłbym się zbytnio. Inną opcją, jeśli masz wątpliwości, jest znalezienie narzędzia takiego jak valgrind i uruchomienie programu. –