Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象销毁后的事件_C++_Qt4 - Fatal编程技术网

C++ 对象销毁后的事件

C++ 对象销毁后的事件,c++,qt4,C++,Qt4,我在一个缓慢的嵌入式系统中遇到了一个奇怪的问题: 如果我足够快,我可以通过双击按钮使应用程序崩溃 这背后的原因是,在这个应用程序中,只要有人单击“确定”按钮,窗口就会关闭。然后,窗口破坏发生在与“pressed()”信号链接的插槽中(如果使用“clicked()”信号,也会发生崩溃)。现在发生的情况是,第一次按下按钮将关闭调用“deleteLater()的窗口。在执行此操作时,将捕获第二次按钮按下的时间并将其放置在事件队列中。我后来从“销毁”信号中得到一条消息,该窗口不再存在,但很快应用程序崩溃

我在一个缓慢的嵌入式系统中遇到了一个奇怪的问题:

如果我足够快,我可以通过双击按钮使应用程序崩溃

这背后的原因是,在这个应用程序中,只要有人单击“确定”按钮,窗口就会关闭。然后,窗口破坏发生在与“pressed()”信号链接的插槽中(如果使用“clicked()”信号,也会发生崩溃)。现在发生的情况是,第一次按下按钮将关闭调用“deleteLater()的窗口。在执行此操作时,将捕获第二次按钮按下的时间并将其放置在事件队列中。我后来从“销毁”信号中得到一条消息,该窗口不再存在,但很快应用程序崩溃,因为QT的事件处理程序是由事件队列中的鼠标按下事件触发的。由于此事件,他尝试访问已被删除的对象

我已经尝试将'QCoreApplication::removePostedEvents(sender())放入由'destroyed()'信号调用的插槽中,但这没有任何区别

我使用的QT版本是4.8.4。这个问题可能在以后的版本中解决了吗

以下是崩溃时的堆栈跟踪:

0   QMetaObject::addGuard   qobject.cpp 400 0xd65390    
1   QPointer<QAbstractButton>::QPointer qpointer.h  60  0x774948    
2   QAbstractButtonPrivate::emitPressed qabstractbutton.cpp 561 0x771df8    
3   QAbstractButton::mousePressEvent    qabstractbutton.cpp 1098    0x773198    
4   QToolButton::mousePressEvent    qtoolbutton.cpp 709 0x804310    
5   QWidget::event  qwidget.cpp 8371    0x39cc90    
6   QAbstractButton::event  qabstractbutton.cpp 1082    0x7730cc    
7   QToolButton::event  qtoolbutton.cpp 1160    0x80594c    
8   QApplicationPrivate::notify_helper  qapplication.cpp    4562    0x347e88    
9   QApplication::notify    qapplication.cpp    4105    0x346144    
10  QCoreApplication::notifyInternal    qcoreapplication.cpp    946 0xd4df34    
11  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  234 0x34a9b8    
12  QETWidget::translateMouseEvent  qapplication_qws.cpp    3528    0x3cb73c    
13  QApplication::qwsProcessEvent   qapplication_qws.cpp    2974    0x3c9660    
14  QEventDispatcherQWS::processEvents  qeventdispatcher_qws.cpp    119 0x3d2468    
15  QEventLoop::processEvents   qeventloop.cpp  149 0xd4b4fc    
16  QEventLoop::exec    qeventloop.cpp  200 0xd4b690    
17  QCoreApplication::exec  qcoreapplication.cpp    1218    0xd4e6f0    
18  QApplication::exec  qapplication.cpp    3823    0x344fac    
19  main    main.cpp    650 0x21900c    
如果我现在沿着堆栈跟踪,我会在级别4“QToolButton::mousePressEvent”处找到以下变量内容:

d    @0x24b6020 QToolButtonPrivate
e    @0xbea566ec    QMouseEvent
opt     QStyleOptionToolButton
this    "" @0x254d010   QToolButton

但是,根据第113行,具有此地址的toolbutton已被删除,这导致程序崩溃。

有关进一步信息,我现在附上toolbutton被销毁时的回溯:

0   layout_n::manager_c::slotButtonDeleted  layoutmanager.cpp   526 0x27eb70    
1   layout_n::manager_c::qt_static_metacall moc_layoutmanager.cpp   243 0x28a4b4    
2   QMetaObject::activate   qobject.cpp 3540    0xd6c2f0    
3   QObject::destroyed  moc_qobject.cpp 149 0xd6dce8    
4   QObject::~QObject   qobject.cpp 843 0xd66c3c    
5   QWidget::~QWidget   qwidget.cpp 1705    0x38be4c    
6   QAbstractButton::~QAbstractButton   qabstractbutton.cpp 608 0x77284c    
7   QToolButton::~QToolButton   qtoolbutton.cpp 409 0x803c48    
8   layout_n::toolButton_c::~toolButton_c   layoutmanager.h 185 0x28b934    
9   layout_n::toolButton_c::~toolButton_c   layoutmanager.h 185 0x28b994    
10  QObjectPrivate::deleteChildren  qobject.cpp 1908    0xd68368    
11  QWidget::~QWidget   qwidget.cpp 1681    0x38bd90    
12  QWidget::~QWidget   qwidget.cpp 1705    0x38bec8    
13  qDeleteInEventHandler   qobject.cpp 4270    0xd6d858    
14  QObject::event  qobject.cpp 1175    0xd67384    
15  QWidget::event  qwidget.cpp 8846    0x39e564    
16  QApplicationPrivate::notify_helper  qapplication.cpp    4566    0x348428    
17  QApplication::notify    qapplication.cpp    4530    0x348260    
18  QCoreApplication::notifyInternal    qcoreapplication.cpp    947 0xd4e6b4    
19  QCoreApplication::sendEvent qcoreapplication.h  231 0x34aee4    
20  QCoreApplicationPrivate::sendPostedEvents   qcoreapplication.cpp    1572    0xd4f950    
21  QCoreApplication::sendPostedEvents  qcoreapplication.cpp    1468    0xd4f548    
22  QCoreApplication::sendPostedEvents  qcoreapplication.h  236 0x3d2e68    
23  QEventDispatcherQWS::flush  qeventdispatcher_qws.cpp    164 0x3d2dbc    
24  QCoreApplication::flush qcoreapplication.cpp    683 0xd4e0d0    
25  QAbstractButton::mousePressEvent    qabstractbutton.cpp 1101    0x773910    
26  QToolButton::mousePressEvent    qtoolbutton.cpp 710 0x804a90    
27  QWidget::event  qwidget.cpp 8371    0x39d230    
28  QAbstractButton::event  qabstractbutton.cpp 1085    0x77384c    
29  QToolButton::event  qtoolbutton.cpp 1162    0x8060cc    
30  QApplicationPrivate::notify_helper  qapplication.cpp    4566    0x348428    
31  QApplication::notify    qapplication.cpp    4108    0x3466e4    
32  QCoreApplication::notifyInternal    qcoreapplication.cpp    947 0xd4e6b4    
33  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  234 0x34af58    
34  QETWidget::translateMouseEvent  qapplication_qws.cpp    3539    0x3cbe08    
35  QApplication::qwsProcessEvent   qapplication_qws.cpp    2984    0x3c9d48    
36  QEventDispatcherQWS::processEvents  qeventdispatcher_qws.cpp    121 0x3d2b5c    
37  QEventLoop::processEvents   qeventloop.cpp  149 0xd4bc7c    
38  QEventLoop::exec    qeventloop.cpp  200 0xd4be10    
39  QCoreApplication::exec  qcoreapplication.cpp    1221    0xd4eec8    
40  QApplication::exec  qapplication.cpp    3823    0x34551c    
41  main    main.cpp    650 0x2192b4    

在那里,您可以看到,QWS系统在第34行捕获鼠标按钮按下,然后将其转发到相应的按钮,该按钮应将按钮绘制为按下状态(第25行),并对事件队列执行刷新以处理绘制事件,在这种情况下,还将查找“稍后删除”(第13行),由上一个鼠标按钮按下事件发布到事件队列并执行此删除的。离开flush函数后,它将继续对非法指针变量进行操作,因为它自己的对象已被销毁

如果您只是在按下的事件处理程序中禁用按钮会怎么样?我已经尝试过了,但事件仍然会被收集和处理。
Line 38: ~~+Creating toolbutton... layout_n::toolButton_c(0x2365250)
Line 39: ~~+Creating toolbutton... layout_n::toolButton_c(0x22bc008)
Line 40: ~~+Creating toolbutton... layout_n::toolButton_c(0x22b5290)
Line 41: ~~+Creating toolbutton... layout_n::toolButton_c(0x22bdf90)
Line 43: ~~+Creating toolbutton... layout_n::toolButton_c(0x2432880)
Line 44: ~~+Creating toolbutton... layout_n::toolButton_c(0x23796a0)
Line 47: ~~+Creating toolbutton... layout_n::toolButton_c(0x2554b10)
Line 48: ~~~Toolbutton destroyed QObject(0x22c91a0)
Line 49: ~~~Toolbutton destroyed QObject(0x2412420)
Line 50: ~~~Toolbutton destroyed QObject(0x24123c0)
Line 51: ~~~Toolbutton destroyed QObject(0x2414a20)
Line 52: ~~~Toolbutton destroyed QObject(0x241ff50)
Line 53: ~~~Toolbutton destroyed QObject(0x241ff70)
Line 54: ~~~Window destroyed: QObject(0x2354cf0, name = "6 34:03.188")
Line 55: ~~~Toolbutton destroyed QObject(0x2554b10)
Line 56: ~~~Window destroyed: QObject(0x2498580)
Line 62: ~~+Creating toolbutton... layout_n::toolButton_c(0x254c038)
Line 63: ~~+Creating toolbutton... layout_n::toolButton_c(0x254d010)
Line 64: ~~~Toolbutton destroyed QObject(0x254c038)
Line 72: ---Pressed!!
Line 94: ---Released!!
Line 95: --DeleteLater of screen:  QWidget(0x235a2c0, name = "7 34:06.573")
Line 96: ~~+Creating toolbutton... layout_n::toolButton_c(0x25bdf90)
Line 97: ~~+Creating toolbutton... layout_n::toolButton_c(0x25bf7d0)
Line 98: ~~+Creating toolbutton... layout_n::toolButton_c(0x25c73d0)
Line 99: ~~+Creating toolbutton... layout_n::toolButton_c(0x25d1dc8)
Line 101: ~~+Creating toolbutton... layout_n::toolButton_c(0x25d72d0)
Line 106: ---Pressed!!
Line 107: ~~~Toolbutton destroyed QObject(0x2365250)
Line 108: ~~~Toolbutton destroyed QObject(0x22bc008)
Line 109: ~~~Toolbutton destroyed QObject(0x22b5290)
Line 110: ~~~Toolbutton destroyed QObject(0x22bdf90)
Line 111: ~~~Toolbutton destroyed QObject(0x2432880)
Line 112: ~~~Toolbutton destroyed QObject(0x23796a0)
Line 113: ~~~Toolbutton destroyed QObject(0x254d010)
Line 114: ~~~Window destroyed: QObject(0x231ec20)
Line 115: ~~~# Query: Trackdeletion PC Overlay
Line 116: ~~~Window destroyed: QObject(0x235a2c0, name = "7 34:06.573")
d    @0x24b6020 QToolButtonPrivate
e    @0xbea566ec    QMouseEvent
opt     QStyleOptionToolButton
this    "" @0x254d010   QToolButton
0   layout_n::manager_c::slotButtonDeleted  layoutmanager.cpp   526 0x27eb70    
1   layout_n::manager_c::qt_static_metacall moc_layoutmanager.cpp   243 0x28a4b4    
2   QMetaObject::activate   qobject.cpp 3540    0xd6c2f0    
3   QObject::destroyed  moc_qobject.cpp 149 0xd6dce8    
4   QObject::~QObject   qobject.cpp 843 0xd66c3c    
5   QWidget::~QWidget   qwidget.cpp 1705    0x38be4c    
6   QAbstractButton::~QAbstractButton   qabstractbutton.cpp 608 0x77284c    
7   QToolButton::~QToolButton   qtoolbutton.cpp 409 0x803c48    
8   layout_n::toolButton_c::~toolButton_c   layoutmanager.h 185 0x28b934    
9   layout_n::toolButton_c::~toolButton_c   layoutmanager.h 185 0x28b994    
10  QObjectPrivate::deleteChildren  qobject.cpp 1908    0xd68368    
11  QWidget::~QWidget   qwidget.cpp 1681    0x38bd90    
12  QWidget::~QWidget   qwidget.cpp 1705    0x38bec8    
13  qDeleteInEventHandler   qobject.cpp 4270    0xd6d858    
14  QObject::event  qobject.cpp 1175    0xd67384    
15  QWidget::event  qwidget.cpp 8846    0x39e564    
16  QApplicationPrivate::notify_helper  qapplication.cpp    4566    0x348428    
17  QApplication::notify    qapplication.cpp    4530    0x348260    
18  QCoreApplication::notifyInternal    qcoreapplication.cpp    947 0xd4e6b4    
19  QCoreApplication::sendEvent qcoreapplication.h  231 0x34aee4    
20  QCoreApplicationPrivate::sendPostedEvents   qcoreapplication.cpp    1572    0xd4f950    
21  QCoreApplication::sendPostedEvents  qcoreapplication.cpp    1468    0xd4f548    
22  QCoreApplication::sendPostedEvents  qcoreapplication.h  236 0x3d2e68    
23  QEventDispatcherQWS::flush  qeventdispatcher_qws.cpp    164 0x3d2dbc    
24  QCoreApplication::flush qcoreapplication.cpp    683 0xd4e0d0    
25  QAbstractButton::mousePressEvent    qabstractbutton.cpp 1101    0x773910    
26  QToolButton::mousePressEvent    qtoolbutton.cpp 710 0x804a90    
27  QWidget::event  qwidget.cpp 8371    0x39d230    
28  QAbstractButton::event  qabstractbutton.cpp 1085    0x77384c    
29  QToolButton::event  qtoolbutton.cpp 1162    0x8060cc    
30  QApplicationPrivate::notify_helper  qapplication.cpp    4566    0x348428    
31  QApplication::notify    qapplication.cpp    4108    0x3466e4    
32  QCoreApplication::notifyInternal    qcoreapplication.cpp    947 0xd4e6b4    
33  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  234 0x34af58    
34  QETWidget::translateMouseEvent  qapplication_qws.cpp    3539    0x3cbe08    
35  QApplication::qwsProcessEvent   qapplication_qws.cpp    2984    0x3c9d48    
36  QEventDispatcherQWS::processEvents  qeventdispatcher_qws.cpp    121 0x3d2b5c    
37  QEventLoop::processEvents   qeventloop.cpp  149 0xd4bc7c    
38  QEventLoop::exec    qeventloop.cpp  200 0xd4be10    
39  QCoreApplication::exec  qcoreapplication.cpp    1221    0xd4eec8    
40  QApplication::exec  qapplication.cpp    3823    0x34551c    
41  main    main.cpp    650 0x2192b4