程序如下,其中在删除指针pData 时候有时会出现错误。请大家帮忙看看可能会出现错误的情况。开始怀疑有队列有相同指针。2次删除同一个指针,但已经判空了??
CTypedPtrArray<CObArray, CIMMessageData *> m_MessageArray;
try
{
   while( m_MessageArray.GetSize() > 0 ) 
     {

CIMMessageData* pData = m_MessageArray.GetAt(0);
m_MessageArray.RemoveAt( 0 );
if( pData != NULL ) 
         {
     delete pData;//有时会出现删除指针错误
     pData = NULL;
} }
}
catch(...)
{
AfxMessageBox("Error");
}

解决方案 »

  1.   

    肯定是内存覆盖、多次释放这样的原因了。
    具体情况得调试程序才能知道。
    ============================================================================
    提问题时标题要简明扼要地说明问题内容,切忌使用"急","求救"之类不能说明问题的标题
    http://alphasun.betajin.com/   遇到问题可以给我发消息,给我发信息时请附带原帖地址
    DocWizard C++程序文档自动生成工具 | Wave OpenGL | HttpProxy | AjaxParser词法分析
      

  2.   

    你的pData是不是应该先New 一下,给它初始值=NULL,再继续下面的操作?
      

  3.   

    CIMMessageData* pData = m_MessageArray.GetAt(0);
    m_MessageArray.RemoveAt( 0 );
    GetAt(0), RemoveAt(0)取得对象后马上删除了对象,pData所指的对象已经删除了,pData指向一块无效的内存。所以会出错。
      

  4.   

    一个new与一个delete龙风配,我只看到你的delete,你的“牛”呢?
      

  5.   

    CTypedPtrArray 有可能会帮你delete指针,但是 CArray 不会
      

  6.   

    换种方式这样释放试一下:
    int nCount = m_MessageArray.GetSize();
    for( int nIndex = 0; nIndex < nCount; nIndex++ )
    {
       CIMMessageData*  pData = m_MessageArray.GetAt(nIndex);
                if( pData != NULL ) 
                {
         delete pData;
         pData = NULL;
       }
    }
             m_MessageArray.RemoveAll();
      

  7.   

    谢谢大家。
    to SeaSurf(风好扬帆):
    这样做不行吗。相当于初始化啊。我试试你的办法。
    to ruihuahan(飞不起来的笨鸟):
     RemoveAt(0)只是将下一位移上来。这时pData所指的对象还存在。
      

  8.   

    to alphapaopao(炮炮):
    CTypedPtrArray 有可能会帮你delete指针?但MSDN上没说过啊。我也没碰到这样的情况。
    由于程序是很早以前开发的。现在改起来很棘手。谢谢大家了
      

  9.   

    CIMMessageData* pData = m_MessageArray.GetAt(0);
    m_MessageArray.RemoveAt( 0 );
    if( pData != NULL ) 
             {
         delete pData;//有时会出现删除指针错误
         pData = NULL;
    }
    其中有时删除错误可能是因为在m_MessageArray中函数GetAt(0)与下一条语句
    m_MessageArray.RemoveAt( 0 );之间肯定关联有问题!
      

  10.   

    要是俺来写,大概会写成这样:CTypedPtrArray<CObArray, CIMMessageData *> m_MessageArray;
    try
    {
       for (int i=0;i<m_MessageArray.GetSize-1;i++ ) 
         {

    CIMMessageData* pData = m_MessageArray.GetAt(0);
    if( pData != NULL ) 
             {
         delete pData;//有时会出现删除指针错误
         pData = NULL;
    }      }
    }
    catch(...)
    {
    AfxMessageBox("Error");
    }
            m_MessageArray.RemoveAll();//或者类似的某个函数
      

  11.   

    俺觉得更可能的原因是m_MessageArray中的指针有指向相同的一个地址的情况!另外,俺上边的代码错误百出,忽略掉算了。
      

  12.   

    你首先要保证你的数组中的元素值都不相同,否则你第二次delete的时候,因为该指针指向的内存已经释放,所以就出错了,建议你将每个元素输出,检查一下是否有重复值
      

  13.   

    CIMMessageData* pData = m_MessageArray.GetAt(0);
    if( pData != NULL ) 
             {
         delete pData;//有时会出现删除指针错误
         pData = NULL;//无效的操作:)
    }
    假设你在数组放了三个地址OX0001, 0X0002, OX0001, 
    你删除了第一个后, 变成0X0002, OX0001
    并不是你想的0X0002, OX0000
      

  14.   

    楼上的老兄说的有道理,我也觉得应该是这种情况。
    你试着这样写代码看行不行:
      int nCount = m_MessageArray.GetSize();
    for( int nIndex = 0; nIndex < nCount; nIndex++ )
    {
       CIMMessageData*  pData = m_MessageArray.GetAt(nIndex);
                for( int i = nIndex + 1; i < nCount; i++ )
                {
                   if( pData == m_MessageArray.GetAt(i))
                        m_MessageArray.SetAt(i, NULL);
                }            if( pData != NULL ) 
                {
         delete pData;
         pData = NULL;
       }
    }         m_MessageArray.RemoveAll();