Qt使用他們稱之爲object trees,這是一個有點不同從典型的RAII方法。
QObject
類constructor需要一個父指針QObject
。當父母QObject
遭到破壞時,其子女也將被銷燬。這是整個Qt類中相當普遍的模式,您會注意到很多構造函數接受*parent
參數。
如果你看一些Qt example programs,你會發現他們實際上在堆上構建了大多數Qt對象,並利用這個對象樹來處理破壞。我個人發現這個策略也很有用,因爲GUI對象可能具有特殊的生命週期。
如果您不使用QObject
或QObject
(如QWidget
)的子類,則Qt不會提供超出標準C++的額外保證。
在您的特定示例中,不保證會刪除任何內容。
你會想是這樣的Des
(假設Des
是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
}
}
而且你會使用Des
類,像這樣:
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
}
這似乎工作得很好。謝謝。 但是,當我創建例如4個新的「測試」 -widgets並再次關閉它們,創建另一個「測試」 -widget不會花費更多的內存,但是應用程序仍然使用盡可能多的內存作爲當4「測試」 -widgets仍然會存在。這是正常的嗎? – Berschi 2009-09-17 14:54:46
@Berschi,Qt或您的操作系統可能會進行一些內存優化。如果你在評論中提到的第五個小部件導致沒有更多的內存被使用,我不會擔心它太多。如果您擔心,另一種選擇是找到像valgrind這樣的工具並通過它運行您的程序。 – 2009-09-17 22:45:33