Qt双免费或腐败

时间:2016-07-12 09:20:11

标签: qt

我开发了一个Qt应用程序,它有一个身份验证小部件和一个主窗口。验证成功后,我使用此代码打开mainWindow

this->~Authentification();
MainWindow *w = new MainWindow(); 

但在关闭主窗口后,我收到双重免费或损坏错误。调试说这个错误的来源是

delete ui;

来自班级Authentification

1 个答案:

答案 0 :(得分:2)

您在this上明确调用了析构函数。你很少需要这样做,而且它们总是应该被抽象出来。此类调用仅属于低级资源管理类。如果您考虑在QObjectQWidget的子类中执行此操作,则很可能不应该这样做!

如果你想要关闭一个窗口,请使用QWidget::close()。但也许您希望销毁小部件实例,以释放它使用的任何资源。然后继续阅读。

我们假设Authentication是一个适当的对话框,分别在认证成功或失败时发出accepted()rejected()信号:

class Authentication : public QDialog {
  ...
};

从这样的对话进行的一些方法可能是:

  1. 将对话框定义为作用域的本地变量,只要对话框处于活动状态就运行事件循环,然后离开作用域:

    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();
    }  
    
  2. 动态分配对话框,并在关闭时自动删除。

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