2013-10-28 53 views
1

我在我的int main()中有幾個動態分配的對象,應該如何在程序結束時刪除這些對象?目前,我覺得我不是在節目的最後釋放內存,這裏的主:在主()Qt項目中動態分配對象

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow *w = new MainWindow; 
    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(); 
} 
+0

實際上,您不必這樣做。通常在QT程序中他們沒有。但它給了我意志,所以我試圖避免這種模式(要麼創建對象的具體實例,要麼使用智能指針)。 – IdeaHat

+1

@MadScienceDreams您不必在由其他對象(父 - 子關係)擁有的對象之後釋放內存。在OP的代碼中沒有這種關係。 – kotlomoy

回答

5
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow *w = new MainWindow; 
    breadData *dat = new breadData("audit.dat"); 
    //link main window with bread data 
    w->_link(dat); 
    //show main window 
    w->show(); 
    //execute loop 
    int result = a.exec(); 
    delete dat; 
    delete w; 
    return result; 
} 

但動態分配看起來很不必要的。
爲什麼不

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    breadData dat("audit.dat"); 
    //link main window with bread data 
    w._link(&dat); 
    //show main window 
    w.show(); 
    //execute loop 
    return a.exec(); 
} 
+0

動態分配實際上現在看起來相當武斷,現在我想到了它。感謝您的第二個片段 –

2

你是正確的,現在你泄露的MainWindow實例和breadData一個實例。

對於QObject實例,最簡單的方法是使用內置的內存管理。讓你的QObjectQApplication擁有,他們將在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構造最好是當它的文件或解析的閱讀失敗拋出異常。否則,你會得到一個「無效」的對象,並祝你的運氣能夠確保應用程序的其他部分知道如何處理它。