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