最近项目遇到了一个bug,压力测试ui总会崩溃,gdb调试未果,跑到了库函数,无从查起:
(gdb)bt
#0 0x4146b1e4 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&,QPoint const&, int, QPainter*, QWidgetBackingStore*) () from/qt/lib/libQt5Widgets.so.5
#1 0x4146bb70 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*,QList<QObject*> const&, int, QRegion const&, QPoint const&,int, QPainter*, QWidgetBackingStore*) ()
from /qt/lib/libQt5Widgets.so.5
#2 0x4146b22c in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&,QPoint const&, int, QPainter*, QWidgetBackingStore*) () from/qt/lib/libQt5Widgets.so.5
#3 0x41443918 in QWidgetBackingStore::sync() () from /qt/lib/libQt5Widgets.so.5
#4 0x41462c9c in QWidgetPrivate::syncBackingStore() () from/qt/lib/libQt5Widgets.so.5
#5 0x4146de64 in QWidget::event(QEvent*) () from /qt/lib/libQt5Widgets.so.5
#6 0x41436a00 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from/qt/lib/libQt5Widgets.so.5
#7 0x4143a590 in QApplication::notify(QObject*, QEvent*) () from/qt/lib/libQt5Widgets.so.5
#8 0x00922918 in ?? ()
#9 0x00922918 in ?? ()
Backtracestopped: previous frame identical to this frame (corrupt stack?)
(gdb)
if(p){
delete p; // 修改为: p->deletelater();
p = NULL;// 这里必须置为NULL,否则依然会出错(delete后置空是一个非常好的习惯)
}
查阅的参考资料如下:http://blog.csdn.net/dbzhang800/article/details/6300025、http://my.oschina.net/u/566875/blog/306299
摘录其中一文片段如下:
QT有一套回收内存的机制,主要的规则如下:
1、所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;(注:这里是在new出来对象的时候,这样依靠QObject释放的内存一点问题没有,如果以下这种起情况,那么程序会崩溃