QMAP导致崩溃问题分析

在使用QMAP的过程中发现导致程序崩溃的神奇问题,很有代表意义,所以把分析过程写出来,与大家共同学习。


一、问题描述

while(1)
{
   	
	QMapIterator<QString, int> i(map);
    while (i.hasNext()) {
   
        i.next();
        qDebug() << i.key() << "1: " << i.value();
    }

	QMap<QString, int>::const_iterator i2 = map.constBegin();
	while (i2 != map.constEnd()) {
   
		qDebug() << i2.key() << "2: " << i2.value();
		++i2;
        }

	QMap<QString, int>::iterator i3 = 	map.find(QString::number((int)this));
    if( i3 != map.end() && i3.key() == QString::number((int)this) )
    {
   
        qDebug() << i3.key() << "3: " << i3.value();
    }
}

上述代码中map为全局变量,多线程运行时会出现coredump
1、反馈上述3段遍历map的代码,屏蔽任何一段都不会coredump。(后来发现不对,屏蔽第2段时也会coredump)。
2、对全部代码加读锁时依然coredump,加写锁时正常。
3、根据代码分析应该没有对map的写操作,但是通过现象分析可能有对map的写操作。


二、源码分析

所以先看QMap的源码有没有对map的写操作,先看QMapIterator的源码
qiterator.h:

#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C) \
\
template <class Key, class T> \
class QMutable##C##Iterator \
{
      \
    typedef typename Q##C<Key,T>::iterator iterator; \
    typedef typename Q##C<Key,T>::const_iterator const_iterator; \
    typedef iterator Item; \
    Q##C<Key,T> *c; \
    iterator i, n; \
    inline bool item_exists() const {
      return const_iterator(n) != c->constEnd(); } \
public: \
    inline QMutable##C##Iterator(Q##C<Key,T> &container) \
        : c(&container) \
    {
      i = c->begin(); n = c->end(); } \
    inline QMutable##C##Iterator &operator=(Q##C<Key,T> &container) \
    {
      c = &container; i = c->begin(); n = c->end(); return *this; } \
    inline void toFront() {
      i = c->begin(); n = c->end(); } \
    inline void toBack() {
      i = c
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值