CList结点删除问题
当我用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




