QMap :: clear()崩溃

时间:2018-08-10 08:55:45

标签: c++ linux qt4 qmap

我正在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;
}

0 个答案:

没有答案