我开发了一个Qt应用程序,它有一个身份验证小部件和一个主窗口。验证成功后,我使用此代码打开mainWindow
this->~Authentification();
MainWindow *w = new MainWindow();
但在关闭主窗口后,我收到双重免费或损坏错误。调试说这个错误的来源是
delete ui;
来自班级Authentification
答案 0 :(得分:2)
您在this
上明确调用了析构函数。你很少需要这样做,而且它们总是应该被抽象出来。此类调用仅属于低级资源管理类。如果您考虑在QObject
或QWidget
的子类中执行此操作,则很可能不应该这样做!
如果你想要关闭一个窗口,请使用QWidget::close()
。但也许您希望销毁小部件实例,以释放它使用的任何资源。然后继续阅读。
我们假设Authentication
是一个适当的对话框,分别在认证成功或失败时发出accepted()
和rejected()
信号:
class Authentication : public QDialog {
...
};
从这样的对话进行的一些方法可能是:
将对话框定义为作用域的本地变量,只要对话框处于活动状态就运行事件循环,然后离开作用域:
int main(int argc, char ** argv) {
QApplication app{argc, argv};
{
Authentication auth;
auto result = auth.exec();
if (result == QDialog::Rejected) return 1;
} // here auth has been destructed
MainWindow window;
window.show();
return app.exec();
}
动态分配对话框,并在关闭时自动删除。
int main(int argc, char ** argv) {
QApplication app{argc, argv};
auto auth = new Authentication;
auth->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(auth, &QDialog::accepted, []{
auto win = new MainWindow;
win->setAttribute(Qt::WA_DeleteOnClose);
win->show();
});
auth->show();
return app.exec();
}