2011-11-03 83 views
3

所以我對Qt的內存管理有些困惑。我一直在尋找在開始樣品和教程,看到這個Qt Widget內存管理

QApplication app(argc, argv); 
QWidget window; 
QLabel *label = new QLabel(QApplication::translate("windowlayout", "Name:")); 
QLineEdit *lineEdit = new QLineEdit(); 

QHBoxLayout *layout = new QHBoxLayout(); 
layout->addWidget(label); 
layout->addWidget(lineEdit); 
window.setLayout(layout); 
window.setWindowTitle(
    QApplication::translate("windowlayout", "Window layout")); 
window.show(); 
return app.exec(); 

這是除了我沒有看到任何內存釋放時,他們創造的新部件就好了,現在這只是本教程,使他們不要混淆人或是由Qt自動處理內存管理。因爲看到這個,我不得不相信存在內存泄漏,因爲沒有任何東西被釋放。

+0

呃,如果他們釋放他們,應用程序將不再存在。這些都是在應用程序關閉之前存在的頂級對象。 –

回答

7

Widget是由他們的父母破壞(當你調用layout->addWidget,例如,佈局採取通過widget的所有權),這些被破壞的時候。在你的情況下,window將在範圍的最後被銷燬(當app.exec返回時),這反過來會破壞佈局,反過來會破壞標籤和編輯框。

Object Trees & Ownership在Qt的文檔。

0

在Qt中,根據層次結構釋放對象。即當QObject被釋放時,所有的子對象都將被釋放(基於作爲參數傳遞給對象構造器的父對象)。

0

Qt構建一個內部的事物樹(佈局,小部件,對話框......),只要Qt認爲這是可以的,就可以釋放它們。這個層次結構是在「東西」的構造函數中用父參數構建的,或者當責任由其他函數調用(如addWidget)傳遞時。所以當Qt或某個小部件接管責任時,您甚至不允許刪除「事物」。請參閱Qt中的文檔。

+1

糟糕 - 太晚了。 – Jens