-
Bug
-
Resolution: Fixed
-
P1: Critical
-
6.3.2
-
None
-
52ce4d2d2 (dev), 2800481b0 (6.4), 927ce8c4f (6.5), 73f33e4da (tqtc/lts-6.2)
Qt6 differently processes Qt::WA_DeleteOnClose than Qt5. With Qt6 is possible to cause a crash by calling QCoreApplication::processEvents() inside slot as described in snippet below.
void MainWindow::showMenu()
{
QMenu *menu = new QMenu(this);
menu->setAttribute(Qt::WA_DeleteOnClose);
menu->addAction(ui->actionStart);
menu->popup(QCursor::pos());
}
void MainWindow::startTriggered()
{
for (int i = 0; i <= 100; i += 1)
{
ui->progressBar->setValue(i);
/* First call to processEvents() triggers QMenu destructor on Qt 6
* QMenu is deleted but the object is still needed by code on stack!
* When this function finishes and the code on stack uses now-deleted
* QMenu object and memory corruption occurs.
*
* On Release builds the crash usually happens the second time the
* action is triggered. When debugging Debug builds in Visual Studio
* the exception is seen after first trigger.
*
* This code works perfectly fine with Qt 5.
*/
QCoreApplication::processEvents();
}
}
Attached is minimal reproducible example that triggers a crash on Qt 6 but works perfectly fine with Qt 5.