if(!g_ClientInfo.IsEmpty())
{
POSITION pos=g_ClientInfo.GetHeadPosition(); 
for(int i=0;i<g_ClientInfo.GetCount();i++)
{

POSITION pos = g_ClientInfo.FindIndex(i); if(pos)
{
CLIENT_INFO* pTmp = (CLIENT_INFO*)g_ClientInfo.GetAt( pos );
if(pTmp->strKey == strKey)
{

g_ClientInfo.RemoveAt(pos);
                                                       delete pTmp;
break;
}
}
}
}
在debug模式下,当程序运行到 RemoveAt(post)的时候
//list_p.cpp
void CPtrList::AssertValid() const
{
CObject::AssertValid(); if (m_nCount == 0)
{
// empty list
ASSERT(m_pNodeHead == NULL);   ////此处ASSERT失败,请问为什么
ASSERT(m_pNodeTail == NULL);
}
else
{
// non-empty list
ASSERT(AfxIsValidAddress(m_pNodeHead, sizeof(CNode)));
ASSERT(AfxIsValidAddress(m_pNodeTail, sizeof(CNode)));
}
}

解决方案 »

  1.   

    这是MSDN中的例子:   CObList list;
       POSITION pos1, pos2;
       CObject* pa;
       
       list.AddHead( new CAge( 21 ) );
       list.AddHead( new CAge( 40 ) );
       list.AddHead( new CAge( 65 ) ); // List now contains (65 40, 21).
       for( pos1 = list.GetHeadPosition(); ( pos2 = pos1 ) != NULL; )
       {
           if( *(CAge*) list.GetNext( pos1 ) == CAge( 40 ) )
           {
               pa = list.GetAt( pos2 ); // Save the old pointer for
                                      //deletion.
               list.RemoveAt( pos2 );
               delete pa; // Deletion avoids memory leak.
           }
       }
    #ifdef _DEBUG
       afxDump.SetDepth( 1 );
       afxDump << "RemoveAt example: " << &list << "\n";
    #endif
      

  2.   

    你把前面的删除以后,再调用
    POSITION pos = g_ClientInfo.FindIndex(i);
    可能这个pos就不是一个有效的pos了
    你把前面的删了,后面的补上,那么就有可能不对了从后面开始删起来
    就是for(int i=0;i<g_ClientInfo.GetCount();i++)
    这个循环从最后一个开始做起来,反过来 试试
      

  3.   

    我上面所说的错误是出现在g_ClientInfo只有一个元素的前提下的!
    也就是g_ClientInfo.GetCount() == 1
      

  4.   

    你先看懂了我给的例子再说有没有人懂吧。不要指望大家都把所有的代码给你写的好好的,参照MSDN的代码修改一下试试看再说呢!ps,你的代码删除了最后一个元素以后,循环并没有退出
    POSITION pos = g_ClientInfo.FindIndex(i);
    这个时候i的位置已经没有合法的元素了,当然会出错。
    handsomerun(毛毛) 已经分析过了。
      

  5.   

    楼主,你的prtlist是不是空的啊因为如果不是为空的话,怎么会跑到if (m_nCount == 0)
    {
    // empty list
    ASSERT(m_pNodeHead == NULL);   ////此处ASSERT失败,请问为什么
    ASSERT(m_pNodeTail == NULL);
    }会跑到这个地方去了呢还有,再好好看看小羽给的那个msdn的例子