首页 > 解决方案 > 删除 QTextEdit 时奇怪的 Qt 崩溃

问题描述

一天来,我一直在为 Qt 崩溃而苦恼。一位同事建议我尝试简化情况,我照做了。我无法让它在一个小型测试应用程序中崩溃,但是在我正在开发的应用程序中,这个愚蠢的最小代码通常在删除行上崩溃(并且调用 deleteLater())没有帮助——我得到了同样的调用堆。

QTextEdit *blah = nullptr;
void MyClass::DoTheThing()
{
   if (blah != nullptr)
   {
       delete blah;
   }
   blah = new QTextEdit();
   blah->setText("BLAH");
   // like, literally, i'm not even attaching the QTextEdit to anything
}

QPushButton 触发 DoTheThing。有时我会立即崩溃,有时需要 15-20 次尝试。

    Qt5Cored.dll!QListData::isEmpty() Line 116  C++
    Qt5Cored.dll!QList<QObject *>::isEmpty() Line 201   C++
    Qt5Cored.dll!QObject::~QObject() Line 1106  C++
    Qt5Widgetsd.dll!QLayout::~QLayout() Line 772    C++
    Qt5Widgetsd.dll!QBoxLayout::~QBoxLayout() Line 571  C++
    [External Code] 
    Qt5Widgetsd.dll!QWidget::~QWidget() Line 1444   C++
    [External Code] 
    Qt5Cored.dll!QObjectPrivate::deleteChildren() Line 2123 C++
    Qt5Widgetsd.dll!QWidget::~QWidget() Line 1532   C++
    Qt5Widgetsd.dll!QFrame::~QFrame() Line 264  C++
    Qt5Widgetsd.dll!QAbstractScrollArea::~QAbstractScrollArea() Line 507    C++
    Qt5Widgetsd.dll!QTextEdit::~QTextEdit() Line 667    C++

QList 当然是子列表,是坏数据。

我还看到了构建QTextEdit 的崩溃。

>   Qt5Cored.dll!QListData::isEmpty() Line 116  C++
    Qt5Cored.dll!QList<QObject *>::isEmpty() Line 201   C++
    Qt5Cored.dll!QObject::~QObject() Line 1106  C++
    Qt5Widgetsd.dll!QGesture::~QGesture() Line 123  C++
    Qt5Widgetsd.dll!QPanGesture::~QPanGesture() Line 304    C++
    [External Code] 
    Qt5Widgetsd.dll!qDeleteAll<QSet<QGesture *>::const_iterator>(QSet<QGesture *>::const_iterator begin, QSet<QGesture *>::const_iterator end) Line 320 C++
    Qt5Widgetsd.dll!qDeleteAll<QSet<QGesture *> >(const QSet<QGesture *> & c) Line 328  C++
    Qt5Widgetsd.dll!QGestureManager::filterEventThroughContexts(const QMultiMap<QObject *,enum Qt::GestureType> & contexts, QEvent * event) Line 418    C++
    Qt5Widgetsd.dll!QGestureManager::filterEvent(QWidget * receiver, QEvent * event) Line 527   C++
    Qt5Widgetsd.dll!QApplication::notify(QObject * receiver, QEvent * e) Line 2960  C++
    Qt5Cored.dll!QCoreApplication::notifyInternal2(QObject * receiver, QEvent * event) Line 1075    C++
    Qt5Cored.dll!QCoreApplication::sendEvent(QObject * receiver, QEvent * event) Line 1470  C++
    Qt5Widgetsd.dll!QWidgetPrivate::propagatePaletteChange() Line 1862  C++
    Qt5Widgetsd.dll!QWidget::setBackgroundRole(QPalette::ColorRole role) Line 4226  C++
    Qt5Widgetsd.dll!QTextEditPrivate::init(const QString & html) Line 194   C++
    Qt5Widgetsd.dll!QTextEdit::QTextEdit(QWidget * parent) Line 636 C++

知道从哪里开始寻找吗?我已经注释掉了所有周围的代码。可能是双重删除,或者某些东西在某处破坏了 Qt 中的一些共享数据,但由于崩溃的半重现性,事实证明它很难调试。也可能是时间问题,尽管其他线程似乎都没有做任何事情。

标签: c++qt

解决方案


好吧,所以这看起来像是从完全不相关的东西中删除的内存。从使用 Qt 对象但与 UI 无关的脆弱函数提前返回可防止此崩溃。

Qt 中没有什么神秘的,这里没有什么可看的,继续前进。


推荐阅读