标题:如果一个对象把自己给销毁了后果如何?详情请见下文
作者:zy498420
日期:2009-08-01 10:28
内容:
第一种情况:对象A的一个成员函数调用了对象B的成员函数,结果B的成员函数把A给销毁了。请问调用返回后何种情况崩溃?
第二种情况(我实际项目遇到的情况的简化叙述):在一个QT程序中,对象B的某个槽执行过程中把导致这个槽的调用的信号发出者给销毁了。实际情况中,偶尔崩溃,偶尔不崩溃。
真实情况是:对象A的自定义信号连到了对象B的自定义槽,信号在一个重载的点击事件处理函数的最后一句发出,发出信号后自定义槽执行的最后一个语句会调用一个全局成员的函数,这个函数的执行结果B,A对象先后被销毁。实际情况中,偶尔崩溃,偶尔不崩溃。运行环境是fedoral 8;qt3.3;g++对应的gcc版本是4.1.2 20070925
崩溃的调试信息如下
#00x053c1388 in QApplication::internalNotify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#10x053c2b39 in QApplication::notify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#20x05358266 in QETWidget::translateMouseEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#30x05357036 in QApplication::x11ProcessEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#40x05368cbb in QEventLoop::processEvents ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#50x053dac60 in QEventLoop::enterLoop ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#60x053dab16 in QEventLoop::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#70x053c0fcf in QApplication::exec () from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#80x080bc455 in main (argc=1, argv=0x4a1) at main.cpp:152
也有时是:
#00x0557eac2 in QTipManager::eventFilter ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#10x053c134b in QApplication::internalNotify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#20x053c2b39 in QApplication::notify ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#30x05358266 in QETWidget::translateMouseEvent ()
from /usr/lib/qt-3.3/lib/libqt-mt.so.3
#40x05357036 in QApplication::x11Pr ..