CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

CList结点删除问题

楼主ztz0717(狗尾草)2005-07-26 15:11:53 在 VC/MFC / 基础类 提问

当我用CList模板建立了一个链表,在取出头结点前,先把他的指针取出来,RemoveHead()后,delete头结点报错了!是不是CList的RemoveHead()里面已经作了内存释放?  
  MsgNode*   pNode   =   NULL;  
  pNode   =   &m_MsgList.GetHead();  
  m_MsgList.RemoveHead();  
  delete   pNode;  
  问题点数:20、回复次数:10Top

1 楼joachern(程序人生)回复于 2005-07-26 15:16:45 得分 0

removeHEad就可以了巴Top

2 楼ztz0717(狗尾草)回复于 2005-07-26 15:20:29 得分 0

但是我先前加入的节点是new出来的,我怕内存泄露Top

3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-26 15:22:18 得分 0

如果是CList<MsgNode,MsgNode&>,就不用delete了。  
   
  如果是CList<MsgNode*,MsgNode*&>那需要delete  
   
  Top

4 楼ztz0717(狗尾草)回复于 2005-07-26 15:30:09 得分 0

我是CList<MsgNode,MsgNode>   m_MsgList;  
   
  MsgNode   *Node   =   new   MsgNode;  
  m_MsgList.AddTail(*Node);Top

5 楼dawning371(风刃)回复于 2005-07-26 15:37:01 得分 0

是的,是CList的RemoveHead()里面已经作了内存释放?  
  需要注意的是CList采用保存副本的方式,如果采用CtypePtrList的话就是保存的指针的方式,前者用其函数删除结点时是删除其链表中的对象实体,而后者仅删除链表中的指针Top

6 楼dawning371(风刃)回复于 2005-07-26 15:37:29 得分 0

是的,是CList的RemoveHead()里面已经作了内存释放Top

7 楼dawning371(风刃)回复于 2005-07-26 15:38:27 得分 10

MsgNode   *Node   =   new   MsgNode;  
  m_MsgList.AddTail(*Node);  
  CList采用保存副本的方式,所以这里的MsgNode   *Node,你要自己释放Top

8 楼WuOu(天堂*蓝珀湖*仰音*诚彦)回复于 2005-07-26 15:51:40 得分 10

你这里是一个保存对象的链表,而不是一个指针链表,CList采用保存副本的方式进行存贮,而你原来new出来的堆则会形成内存泄漏,建议采用CList<MsgNode,MsgNode*>形式.Top

9 楼ztz0717(狗尾草)回复于 2005-07-26 16:24:16 得分 0

哦,谢谢大家了,综合大家的观点,我搞清楚了是怎么回事,CList在加入节点节点时他自己内部会new一个节点,加入时,只是把新节点的内容给拷贝进去,并不是把我new出来的这个节点加到链表上去,在他的RemoveHead里面也作了释放他自己new出来的空间这些事,我pNode   =   &m_MsgList.GetHead();得到的指针就是他自己new出来的那个,并不是我new出来的那个,delete时当然要出错了,其实,当初加入时,并不一定要用new   一个MsgNode*   pNode,用MsgNode   pNode就完全可以了,也不用释放内存,更安全!再次谢谢大家!Top

10 楼dawning371(风刃)回复于 2005-07-27 13:23:16 得分 0

给分沙Top

相关问题

  • 如何删除xml中的结点
  • 数据库删除TreeView子结点
  • 删除双链表的一个结点?
  • treeview在数据库中删除父结点其所有的子结点
  • 链表删除后,删除的结点占用的内存如何释放?
  • 求AVL-trees插入、删除结点的C++代码!
  • 怎么对TreeView结点 移动 删除 添加 ????
  • 删除链首的结点时,为何出错?
  • 怎样将treeview中的第二层结点全部删除?
  • 如何查找到并删除XmlDataDocument中的某一结点?

关键词

  • 结点
  • 节点
  • 指针
  • 内存
  • clist
  • msgnode
  • removehead
  • msglist
  • 删除
  • pnode

得分解答快速导航

  • 帖主:ztz0717
  • dawning371
  • WuOu

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo