C++ 关闭小部件的Qt析构函数调用

C++ 关闭小部件的Qt析构函数调用,c++,qt,memory-management,destructor,C++,Qt,Memory Management,Destructor,有一个处理文本命令的应用程序。我有一个Qt小部件,它是用一些close*命令关闭的Qt::WA_DeleteOnClose属性是为该小部件设置的,它接收closeEvent,但稍后会调用该对象的析构函数(我猜是在空闲时)。如果我有两个命令 close*;得到一些东西程序崩溃,因为在该小部件的析构函数之前调用了get something,所以它尝试访问通过close*命令删除的数据。如何强制Qt调用析构函数QCoreApplication::processEvents()关闭后命令没有帮助。 在将

有一个处理文本命令的应用程序。我有一个Qt小部件,它是用一些
close*
命令关闭的<代码>Qt::WA_DeleteOnClose属性是为该小部件设置的,它接收closeEvent,但稍后会调用该对象的析构函数(我猜是在空闲时)。如果我有两个命令
close*;得到一些东西程序崩溃,因为在该小部件的析构函数之前调用了
get something
,所以它尝试访问通过
close*
命令删除的数据。如何强制Qt调用析构函数<代码>QCoreApplication::processEvents()
关闭后命令没有帮助。 在将qt版本从4.3.3更改为4.7.2之后,我遇到了这个问题。这里没有多线程

提前谢谢

已添加

下面是代码示例

test *t = new test();
t->show();
std::cout << "before deleteLater()" << std::endl;
t->deleteLater();
std::cout << "after deleteLater()" << std::endl;
QCoreApplication::sendPostedEvents();
QCoreApplication::processEvents();
std::cout << "after processEvents()" << std::endl;
根据Qt文档,它应该在最后一次库特之前删除对象,对吗?看起来像Qt中的一个bug,有人知道吗?有解决办法吗

我在Qt邮件列表中问了这个问题,但仍在等待答案

谢谢

再更新一次

此代码

Dialog::~Dialog() {
    std::cout << "~test()" << std::endl;
}

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    Dialog* dlg = new Dialog();
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->show();
    dlg->close();
    std::cout << "before sendPostedEvents()" << std::endl;
    QCoreApplication::sendPostedEvents();
    std::cout << "after sendPostedEvents()" << std::endl;
    return app.exec();
}
但只要我添加closeEvent处理程序并在该处理程序函数中调用deleteLater(),sendPostedEvents就会开始删除延迟对象

void Dialog::closeEvent(QCloseEvent* ev) {
    deleteLater();
    QWidget::closeEvent(ev);
}
打印这个 sendPostedEvents()之前 ~test() sendPostedEvents()之后

谁能解释一下那里到底发生了什么?只是一只虫子吗?我可以用它来解决问题吗


这是怎么回事?如果设置了CloseOnDelete属性,那么在接受closeEvent之后,Qt不应该自动调用deleteLater()吗

设置意味着qt可以在调用后随时删除,因为qt在内部使用。您可以使用信号确保删除。

QCoreApplication::processEvents显式跳过关闭事件时的删除。您需要将QEventLoop::DeferredElement传递给processEvents()。i、 e.QCoreApplication::processEvents(QEventLoop::DeferredElection)

我可以通过在closeEvent函数中为该小部件添加deleteLater()函数调用来修复它。但我想了解解决方案。请您详细解释一下,或者提供一个链接来解释这种技术,好吗?我想确保在我执行完第一个命令的那一刻,Qt将删除。我怎么做?如果你能关闭它,你也可以删除它。不要设置
Qt::WA_DeleteOnClose
标志并简单地删除它。那你就可以肯定了。这个应用程序真的很庞大,那么我需要确保从调用close的任何地方删除它。我不想在那里做太多改变。这可能会导致内存泄漏。难道不能强制Qt删除标记为DeleteOnClose的对象吗?根据Qt文档,您也可以使用
sendPostedEvents()
。如果你能找到一个解决方案,你能在这里更新一下吗。我也有同样的问题,我真的很好奇如何解决它。
before sendPostedEvents()
after sendPostedEvents()
~test()
void Dialog::closeEvent(QCloseEvent* ev) {
    deleteLater();
    QWidget::closeEvent(ev);
}