不会啊,CMapStringToPtr我用过好多遍,没出过问题。你把删除元素和释放内存的那部分贴出来看看。

解决方案 »

  1.   

    char * pTrade = new char[FIXED_SIZE + 
    trade.OrderInfo.GetLength() +  trade.TradInfo.GetLength() + 8]; //分配用来存放交易的内存
    ZeroMemory(pTrade,FIXED_SIZE +  trade.OrderInfo.GetLength() +  trade.TradInfo.GetLength() + 8);
    memcpy(pTrade,trade.AccountId,8);//映射里面存贮信息为
    //帐号+交易描述
    ....//拷贝各个成员
    m_tradecol.SetAt(temp,pTrade);//m_tradecol是一个映射
    //用PrivateID作为关键字插入到映射里面,以后可以用关键字进行快速查找

    //以下是退出时的代码
    POSITION pos = m_tradecol.GetStartPosition();
    void *buf;
    CString PriID;
    for(int i = 0;i < m_tradecol.GetCount();i ++)
    {//采用遍历释放所有内存
              m_tradecol.GetNextAssoc(pos,PriID,buf);
    m_tradecol.RemoveKey(PriID);
    delete [] buf; //在这行出错
    }
    大虾,代码我贴出来了,请帮忙分析以下
      

  2.   

        你好,你只要把delete [] buf放到循环外面就行了。自己想一想,应该明白为什么了吧!
      

  3.   

    RedFire:我是要对映射中的每一项都要释放内存,因为每一次循环得到的buf都是不一样的。
    而且,你说的也解决不了问题。
      

  4.   

    for(int i = 0;i < m_tradecol.GetCount();i ++)
    {//采用遍历释放所有内存
              m_tradecol.GetNextAssoc(pos,PriID,buf);
    m_tradecol.RemoveKey(PriID);
    delete [] buf; //在这行出错
    }
    这种方法是不对的,i在增加,m_tradecol.GetCount()在减小
    即使不出错也无法释放全部内存,可以用以下方法
       for( pos = map.GetStartPosition(); pos != NULL; )
       {
       map.GetNextAssoc( pos, key, buf);
       map.RemoveKey(key);
       delete []buf;
       }
    但是
    m_tradecol.RemoveKey(PriID);
    delete [] buf; 不应该有错我写了一小段代码测试,没有问提,可参考
    CMapStringToPtr map;
    char *buf=new char[100];
    strcpy(buf,"1111");
    map.SetAt("11",buf);
    buf=new char[100];
    strcpy(buf,"2222");
    map.SetAt("22",buf);
    buf=new char[100];
    strcpy(buf,"3333");
    map.SetAt("33",buf);
    POSITION pos;
    CString key;
    void *ptr;
       for( pos = map.GetStartPosition(); pos != NULL; )
       {
       map.GetNextAssoc( pos, key, ptr);
       map.RemoveKey(key);
       delete []ptr;
       }
      

  5.   

    先删除指针,然后再RemoveKey,这样就不会有问题了。
      

  6.   

    感谢各位大虾了,昨天事情解决了,不过有点出人意料,没想到问题的真正原因竟然是我在给分配的内存赋值的时候越界了,但当时什么错误都没有,直到释放的时候。不过sunqi的回答给了我很大的启示,我马上会给分的。