【发布时间】:2016-02-05 02:22:18
【问题描述】:
我在使用 Qt 4.8.6 的 OS X 上遇到了一个非常奇怪的崩溃。
我有一段非常简单的代码(在我们的 Windows 和 Linux 版本中运行良好):
QStringList list;
list << "test";
我发现追加操作会在运行时崩溃,并出现以下堆栈跟踪:
QBasicAtomicInt::ref() { asm volatile("lock\n" ... }
QString::QString(QString const&)
QString::QString(QString const&)
QList<QString>::node_copy(QList<QString>::Node*from, QList<QString>::Node*, QList<QString>::Node*)
QList<QString>::detach_helper_grow(int, int)
QList<QString>::append(QString const&)
QStringList::operator<<(QString const&)
包括 QStringList 的析构函数在内的大多数其他操作都会导致类似的崩溃。
我真的不知道如何进一步调试,任何建议将不胜感激。
谢谢!
【问题讨论】:
-
这可能不仅仅是
QStringList失败。最低级别的堆栈帧显示崩溃最有可能发生在QBasicAtomicInt类中。 -
确实感觉它可能与隐式共享和引用计数有关。但是,我还看到在 QString 复制构造函数中,源字符串数据似乎为空...
-
在启用addresssanitizer的情况下重新编译,再次运行它,看看它是否抱怨内存损坏。
-
当附加的字符串或字符串列表已被删除或类似时,通常回溯看起来像这样。这两行是在整个代码之上,还是在 QStringList 声明和
-
就是这两行,取自我所做的简单单元测试,看看它是否也会在我们的构建机器上崩溃。
标签: c++ macos qt crash qstring