关于CTypedPtrList的问题,兄弟们,快来帮忙啊!

uldm1027 2008-04-17 10:01:26
我定义了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()清空里面的内存吗?
...全文
295 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WZY_5117 2009-03-17
  • 打赏
  • 举报
回复
楼主我也遇到了这个问题,能把解决的方法具体讲出来吗?
scq2099yt 2008-04-17
  • 打赏
  • 举报
回复
看看是否到了列表的末尾
Kudeet 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhoujianhei 的回复:]
想问下能直接用m_listBookMark.RemoveAll()清空里面的内存吗?
===========================================================
不能,必须自己释放。
[/Quote]

Agree
RemoveAll只是清空了列表,并没有删除列表中每个对象分配的数据。
CTypedPtrList里面实际上保存的只是指针。我们需要释放每个指针指向的内容。
yusheng9966 2008-04-17
  • 打赏
  • 举报
回复
这个是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();

uldm1027 2008-04-17
  • 打赏
  • 举报
回复
多谢各位的帮助,我按yusheng9966 同志的方法去做了下,结果还是出问题,就是获得最后那个元素时再BookMarks=m_listBookMark.GetAt(pos)一下,此时我看了下BookMarks(m_listBookMark最后哪个不空),好象内容为空,所以导致delete出现错误,搞了半天看不出来那出了问题,所以想继续请教各位,到底那出了问题.
zhoujianhei 2008-04-17
  • 打赏
  • 举报
回复
想问下能直接用m_listBookMark.RemoveAll()清空里面的内存吗?
===========================================================

不能,必须自己释放。
yusheng9966 2008-04-17
  • 打赏
  • 举报
回复
按如下修改。变历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();


uldm1027 2008-04-17
  • 打赏
  • 举报
回复
不好意思,有位兄弟没给到
uldm1027 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yusheng9966 的回复:]
如果指针变量什么也不指,或者delete后就会没这种现象。结贴给分吧。
[/Quote]
好象明天才能给分.给分每个人都给还是只能给一个?还是其他的?
yusheng9966 2008-04-17
  • 打赏
  • 举报
回复
如果指针变量什么也不指,或者delete后就会没这种现象。结贴给分吧。
uldm1027 2008-04-17
  • 打赏
  • 举报
回复
谢谢各位,问题已经解决了,我在添加多个元素时只new一次.后来把 new对象时 放到循环里事问题就解决了.呵呵!多谢各位的帮助.
uldm1027 2008-04-17
  • 打赏
  • 举报
回复
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时就是出现问题,不知道各位有没遇到这种情况.

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧