你是正確的,現在你泄露的MainWindow
實例和breadData
一個實例。
對於QObject
實例,最簡單的方法是使用內置的內存管理。讓你的QObject
由QApplication
擁有,他們將在QApplication
遭到破壞時被刪除。
對於其他對象,無論如何都要使用智能指針 - 就像你應該那樣!
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget g; // dummy, just to demonstrate ownership - will delete children
// upon leaving the scope
// 1. For QObjects/QWidgets
// 1a. use QObject/QWidget ownership
MainWindow *w = new MainWindow(&g);
// 1b. or use a smart pointer
QScopedPointer<MainWindow> w(new MainWindow);
// 2. For any other class: use smart pointers
QScopedPointer<breadData> dat(new breadData("audit.dat"));
//link main window with bread data
w->_link(dat);
//show main window
w->show();
//execute loop
return a.exec();
}
順便說一句,這breadData
構造最好是當它的文件或解析的閱讀失敗拋出異常。否則,你會得到一個「無效」的對象,並祝你的運氣能夠確保應用程序的其他部分知道如何處理它。
實際上,您不必這樣做。通常在QT程序中他們沒有。但它給了我意志,所以我試圖避免這種模式(要麼創建對象的具體實例,要麼使用智能指針)。 – IdeaHat
@MadScienceDreams您不必在由其他對象(父 - 子關係)擁有的對象之後釋放內存。在OP的代碼中沒有這種關係。 – kotlomoy