我正在Linux i686上运行Qt-4.8.6
我有一个
QMap<quint32, QTreeWidgetItem *> mymap;
当我简单地打电话
mymap.clear();
程序因堆栈跟踪而崩溃
...
#7 <signal handler called>
#8 0x0806f50c in QBasicAtomicInt::deref (this=0x34) at /usr/local/Trolltech/Qt-4.8.6/include/QtCore/qatomic_i386.h:110
#9 0xa968c452 in QMap<unsigned int, QTreeWidgetItem*>::operator= (this=0xc53c51c, other=@0xbfa04b28)
at /usr/local/Trolltech/Qt-4.8.6/include/QtCore/qmap.h:412
#10 0xa968c4d1 in QMap<unsigned int, QTreeWidgetItem*>::clear (this=0xc53c51c)
at /usr/local/Trolltech/Qt-4.8.6/include/QtCore/qmap.h:424
...
抱歉,我无法粘贴完整的stacktrace /代码,因为我不拥有代码。
这个问题并非每次都会发生,或者我应该说很少发生,但是确实发生了。我用Google搜索,但只发现了诸如“重新安装Qt”,“使用相同的编译器”之类的内容。
我还能做些什么吗?
编辑
如果有帮助,我可以粘贴一些相关的Qt源代码
// qmap.h
template <class Key, class T>
Q_INLINE_TEMPLATE void QMap<Key, T>::clear()
{
*this = QMap<Key, T>();
}
template <class Key, class T>
Q_INLINE_TEMPLATE QMap<Key, T> &QMap<Key, T>::operator=(const QMap<Key, T> &other)
{
if (d != other.d) {
QMapData* o = other.d;
o->ref.ref();
if (!d->ref.deref())
freeData(d);
d = o;
if (!d->sharable)
detach_helper();
}
return *this;
}
// qatomic_i386.h
inline bool QBasicAtomicInt::deref()
{
unsigned char ret;
asm volatile("lock\n"
"decl %0\n"
"setne %1"
: "=m" (_q_value), "=qm" (ret)
: "m" (_q_value)
: "memory");
return ret != 0;
}