c++ - 删除 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 中的一些共享数据,但由于崩溃的半重现性,事实证明它很难调试。也可能是时间问题,尽管其他线程似乎都没有做任何事情。
解决方案
好吧,所以这看起来像是从完全不相关的东西中删除的内存。从使用 Qt 对象但与 UI 无关的脆弱函数提前返回可防止此崩溃。
Qt 中没有什么神秘的,这里没有什么可看的,继续前进。
推荐阅读
- java - 如何将 javafx(前端)连接到休眠(后端)
- json - SwiftUI:使用 Text() 而不是 List 显示 JSON 数据
- mysql - 当两个行号相同时选择值
- ubuntu-18.04 - 我搞砸了我的 Steam 安装,如何修复损坏的软件包?
- angular - 最初加载现有选项失败
- .net - Nuget 中的 Nito.AsyncEx 包如何针对多个框架
- c# - 通过 Arduino 的 COM 端口接收的结构在某些但不是所有字段中的值不正确
- bash - 如何在 bash 中插入动态匹配模式?
- java - 编译器无法识别我对 .getPoint 的输入
- quarkus - 具有 jaeger opentracing 支持的 quarkus reactive-postgresql-client