在一个项目中用多线程访问全局变量,全局变量是用STL MAP声明的,程序运行时有时却老有迭代器的异常,要么不兼容,要么引用不到了,索性自己写了一个,虽然不是真正的MAP类,我是用链表实现的,可是用起来时也遇到一些问题,链表长度为n,中间某个节点的pNext为空了,这样就麻烦了我自己找不出原因大家看我这实现有啥问题/*
此类实现中key目前只支持STL的string类型 value值类型不限
*/
template<class Key,class Value>
class CMapTemplate
{
public:
    //map实际上也是基于链表实现,MapT结构即为链表节点的结构
    struct mapT
    {
        //指向上一个节点
        mapT * pPrevious;
        //map的关键字
        Key key;
        //关键字对应的值
        Value value;
        //指向下一个节点
        mapT * pNext;
    };    CMapTemplate()
    {
        length=0;
        //map初始化时new一个mapT节点用于存放首个加入的节点的指针 该指针村在pNext字段内
        pHead = new mapT();
        if (NULL!=pHead)
        {
           memset(pHead,0,sizeof(mapT));
        }
        //初始时 pTail为空
        pTail = NULL;
    };    ~CMapTemplate()
    {
    };    mapT * insert(Key& x,Value &y) 
    {
        //pHead为链表头 空链表也有 只不过空链表pTail为空,若pTail为空则new一个 存入数据
        if (NULL==pTail)
        {
            pTail = new mapT();
            if (NULL!=pTail)
            {
                //如果头不为空 则pTail连载pHead之后
                if (NULL!=pHead)
                {
                    pTail->key=x;
                    pTail->value=y;
                    pTail->pNext=NULL;
                    pTail->pPrevious=pHead;
                    pHead->pNext=pTail;
                    length++;
                    return pTail;
                }
                else
                {
                    //若头为空 则pTail取代pHead
                    pTail->key=x;
                    pTail->value=y;
                    pTail->pNext=NULL;
                    pTail->pPrevious=NULL;
                    pHead=pTail;
                    pTail = NULL;
                    length++;
                    return pHead;
                }
            }
            else
            {
                //怎么分配不到内存呢?
                return NULL;
            }
        }
        else
        {
            //此时pHead后已经有了节点 即实际存放了内容 则新new一个节点 连载pTail之后 并取代pTail节点
            mapT * li = new mapT();
            if (NULL!=li)
            {
                li->key=x;
                li->value=y;
                li->pNext=NULL;
                li->pPrevious=pTail;
                pTail->pNext=li;
                pTail=li;
                length++;
                return li;
            }
            else
            {
                return NULL;
            }
        }
    };    int getLength()
    {
        return length;
    };    //如果T是一个结构体 就用这个函数
    mapT * erase(mapT *pElement)
    {
        if (NULL!=pElement)
        {
            //如果是map头 则取头之后的下一个节点 取代pHead
            if (pElement==pHead)
            {
                pHead=pElement->pNext;                if (length>0&&pHead->pNext==NULL)
                {
                    ::MessageBox(NULL,"问题所在","",0);
                }
                delete pElement;
                pElement=NULL;
                //::MessageBox(NULL,"不能删除链表头","",0);
                return pHead;
            }            //如果是头尾之外的节点 则连接相应指针后删除
            if (pElement!=pHead&&pElement!=pTail)
            {
                mapT * pTemp=NULL;
                pTemp = pElement;
                if (NULL!=pElement->pPrevious)
                {
                    pElement->pPrevious->pNext=pElement->pNext;
                }
                
                if (NULL!=pElement->pNext)
                {
                    pElement->pNext->pPrevious=pElement->pPrevious;
                }
                
                pElement=pElement->pNext;
                --length;
                if (length>0&&pHead->pNext==NULL)
                {
                    ::MessageBox(NULL,"问题所在","",0);
                }
                delete pTemp;
                pTemp = NULL;
                return pElement;
            }            //如果是尾节点 则删掉节点 赴pTail为空
            if (pElement==pTail)
            {
                if (NULL!=pElement->pPrevious)
                {
                    pElement->pPrevious->pNext=NULL;
                }
                --length;
                if (length>0&&pHead->pNext==NULL)
                {
                    ::MessageBox(NULL,"问题所在","",0);
                }
                pTail = NULL;
                delete pElement;
                pElement = NULL;
                return pTail;
            }
        }
        else
        {
            ::MessageBox(NULL,"不能删除空元素","",0);
        }
        return NULL;
    }
public: 
    mapT *pHead;
    mapT *pTail;
    int length;
};

解决方案 »

  1.   

    这不是自找麻烦嘛,有现成的map类可以使用,也是模板类

    出现异常那是lz没有做好同步导致
      

  2.   

    你用STL中的map有问题?应该操作很简单的
      

  3.   

    我是觉得STL的迭代器异常 有些烦人。。才想自己控制信息的存放 不想着也有麻烦 高手能花上几分钟看看我的代码 想删除 插入功能 有没有潜在的错误存在呢
      

  4.   

    因为我的是多线程程序 它出一些迭代器不兼容 还有derefercable错误,我找不出原因 才自己写的