Qt中delete的问题

最近项目遇到了一个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)

后来发现问题是qt中使用delete出错,

        if(p){

           delete p;  // 修改为: p->deletelater();

           p = NULL;// 这里必须置为NULL,否则依然会出错(delete后置空是一个非常好的习惯)

       }

查阅的参考资料如下:

http://blog.csdn.net/dbzhang800/article/details/6300025http://my.oschina.net/u/566875/blog/306299

摘录其中一文片段如下:

QT有一套回收内存的机制,主要的规则如下:

1、所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;(注:这里是在new出来对象的时候,这样依靠QObject释放的内存一点问题没有,如果以下这种起情况,那么程序会崩溃

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值