我定义了CTypedPtrList<CObList,C_BookMarks*> m_listBookMark中间添加若干元素,程序退出时,执行下面代码:
        POSITION pos,posDel;
C_BookMarks *BookMarks;
pos=m_listBookMark.GetHeadPosition();
while (pos!=NULL)
{
BookMarks=m_listBookMark.GetAt(pos);
posDel=pos;
m_listBookMark.GetNext(pos);
m_listBookMark.RemoveAt(posDel);
delete BookMarks;
}
m_listBookMark.RemoveAll();不知道为啥!每次调试到删除最后一个元素时delete BookMarks;便出现非法操作.
想问下能直接用m_listBookMark.RemoveAll()清空里面的内存吗?

解决方案 »

  1.   

    按如下修改。变历list的时候是不能删除节点的。最后removeAll()就行了。
            
    POSITION pos; 
    C_BookMarks *BookMarks; 
    pos=m_listBookMark.GetHeadPosition(); 
    while (pos!=NULL) 

    BookMarks=m_listBookMark.GetAt(pos); 
    delete BookMarks;
    m_listBookMark.GetNext(pos);  

    m_listBookMark.RemoveAll(); 
      

  2.   

    想问下能直接用m_listBookMark.RemoveAll()清空里面的内存吗? 
    ===========================================================不能,必须自己释放。
      

  3.   

    多谢各位的帮助,我按yusheng9966 同志的方法去做了下,结果还是出问题,就是获得最后那个元素时再BookMarks=m_listBookMark.GetAt(pos)一下,此时我看了下BookMarks(m_listBookMark最后哪个不空),好象内容为空,所以导致delete出现错误,搞了半天看不出来那出了问题,所以想继续请教各位,到底那出了问题.
      

  4.   

    这个是MSDN上的例子,肯定不会错了。你是不是在其它地方删除了那个指针?CTypedPtrList<CObList, CPerson*> myList;
    POSITION pos = myList.GetHeadPosition();while( pos != NULL )
    {
        delete myList.GetNext( pos );
    }
    myList.RemoveAll();
    建议判断一个指针是否为空。POSITION pos; 
    C_BookMarks *BookMarks; 
    pos=m_listBookMark.GetHeadPosition(); 
    while (pos!=NULL) 

        BookMarks=m_listBookMark.GetAt(pos); 
        if( BookMarks != NULL )
            delete BookMarks;
        m_listBookMark.GetNext(pos);  

    m_listBookMark.RemoveAll(); 
      

  5.   


    Agree
    RemoveAll只是清空了列表,并没有删除列表中每个对象分配的数据。
    CTypedPtrList里面实际上保存的只是指针。我们需要释放每个指针指向的内容。
      

  6.   

    POSITION pos; 
    C_BookMarks *BookMarks; 
    pos=m_listBookMark.GetHeadPosition(); 
    while (pos!=NULL) 

        BookMarks=m_listBookMark.GetAt(pos); 
        if( BookMarks != NULL )
            delete BookMarks;
        m_listBookMark.GetNext(pos);  

    m_listBookMark.RemoveAll(); 
    好想还是出现问题,哎!比较无语.获得最后那个元素时BookMarks=m_listBookMark.GetAt(pos),此时我看了下BookMarks好象有地址,因此BookMarks != NULL ,但里面的数据成员都为空的!(本来理论上有值的)但delete时就是出现问题,不知道各位有没遇到这种情况.
      

  7.   

    谢谢各位,问题已经解决了,我在添加多个元素时只new一次.后来把 new对象时 放到循环里事问题就解决了.呵呵!多谢各位的帮助.
      

  8.   

    如果指针变量什么也不指,或者delete后就会没这种现象。结贴给分吧。