1

我的 中有几个动态分配的对象,我int main()应该如何在程序结束时删除它们?目前我认为我没有在程序结束时释放内存,这是主要的:

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();
}
4

2 回答 2

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();
}
于 2013-10-28T16:28:18.490 回答
2

你是对的,现在你正在泄漏一个实例MainWindow和一个breadData.

例如QObject,最简单的做法是使用内置的内存管理。使您QObject的 s 归其所有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当读取文件或解析文件失败时,该构造函数最好抛出异常。否则你会得到一个“无效”的对象,祝你好运,确保应用程序的其余部分知道如何处理它。

于 2013-10-28T16:28:30.663 回答