在main()Qt项目中动态分配对象

时间:2013-10-28 16:25:10

标签: c++ qt object dynamic

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

你是对的,现在你正在泄漏MainWindow的实例和breadData的实例。

对于QObject个实例,最简单的方法是使用内置内存管理。让QObject拥有QApplicationQApplication将被删除{<1}}。

对于其他对象,使用智能指针 - 无论如何都应该如此!

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();
}
BTW,breadData构造函数在读取文件或解析文件失败时最好抛出异常。否则你会得到一个“无效”的对象,祝你好运,确保应用程序的其余部分知道如何处理它。