我在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的析构函数在内的大多数其他操作也会导致类似的崩溃。

我真的不知道如何进一步调试它,任何建议将不胜感激。

谢谢!

最佳答案

这看起来像Qt库的典型情况,它是由与您的应用程序其余部分不同的编译器构建或由不同的C++库链接的。在OS X上,罪魁祸首往往是libstdc++与libc++,它们具有不兼容的字符串实现等。

您可以用一个简单的例子来重现吗?例如:

qstringlist.pro:
SOURCES = qstringlist.cpp
qstringlist.cpp:

#include <QStringList>
#include <iostream>
int main(int argc, char *argv[]) {
  QStringList list;
  list << "test";
  std::cout << list.join(" ").toStdString() << std::endl;
}

..then qmake qstringlist.pro && make && ./qstringlist.app/Contents/MacOS/qstringlist
为了解决这个问题,如果我想在其他系统上运行,我通常会使用自己精心选择的构 build 置来构建Qt。

关于c++ - QStringList.append()在OS X上崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35215277/

10-11 15:46