第一种情况:对象A的一个成员函数调用了对象B的成员函数,结果B的成员函数把A给销毁了。请问调用返回后何种情况崩溃?
第二种情况(我实际项目遇到的情况的简化叙述):在一个QT程序中,对象B的某个槽执行过程中把导致这个槽的调用的信号发出者给销毁了。实际情况中,偶尔崩溃,偶尔不崩溃。
真实情况是:对象A的自定义信号连到了对象B的自定义槽,信号在一个重载的点击事件处理函数的最后一句发出,发出信号后自定义槽执行的最后一个语句会调用一个全局成员的函数,这个函数的执行结果B,A对象先后被销毁。实际情况中,偶尔崩溃,偶尔不崩溃。运行环境是fedoral 8;qt3.3;g++对应的gcc版本是4.1.2 20070925
崩溃的调试信息如下
#0 0x053c1388 in QApplication::internalNotify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#1 0x053c2b39 in QApplication::notify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#2 0x05358266 in QETWidget::translateMouseEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#3 0x05357036 in QApplication::x11ProcessEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#4 0x05368cbb in QEventLoop::processEvents ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#5 0x053dac60 in QEventLoop::enterLoop ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#6 0x053dab16 in QEventLoop::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#7 0x053c0fcf in QApplication::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#8 0x080bc455 in main (argc=1, argv=0x4a1) at main.cpp:152
也有时是:
#0 0x0557eac2 in QTipManager::eventFilter ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#1 0x053c134b in QApplication::internalNotify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#2 0x053c2b39 in QApplication::notify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#3 0x05358266 in QETWidget::translateMouseEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#4 0x05357036 in QApplication::x11ProcessEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#5 0x05368cbb in QEventLoop::processEvents ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#6 0x053dac60 in QEventLoop::enterLoop ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#7 0x053dab16 in QEventLoop::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#8 0x053c0fcf in QApplication::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#9 0x080bc4d5 in main (argc=1, argv=0x805d960) at main.cpp:152
还请高手们不吝赐教!!