gpt4 book ai didi

Qt双免费或损坏

转载 作者:行者123 更新时间:2023-12-01 15:02:14 26 4
gpt4 key购买 nike

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

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

但是在我关闭主窗口后,我收到了双重释放或损坏错误。调试说这个错误的来源是
delete ui;

来自类(class) Authentification

最佳答案

您在 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();
    }
  • 关于Qt双免费或损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38324757/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com