主题:建立链表后,VC调试出现内存泄露。怎样解决?(加分)
wwjxjj
[专家分:760] 发布于 2007-12-25 08:26:00
刚自学了数据结构的单向链表,在实际运用中我建立了一个带表头监督元的单向链表,并实现插入新节点和删除指定节点的操作,可是运行VC后却发现有内存泄露!我想应该是 new了节点后没有在退出程序时释放的结果,那不就是说应该释放整个链表归还堆内存?可是书上没有说是否应该怎样和怎样释放整个链表。请各位好心人帮帮忙,期待你的回复,非常感谢!
回复列表 (共4个回复)
沙发
yjlh1234 [专家分:420] 发布于 2007-12-25 15:14:00
我来沙发?。。。呵呵
//------------
void CList::Release()
{
CListNode * pNext =NULL;
if(m_pHead) //如果有接点 m_pHead指向的是头接点
{
pNext = m_pHead ->m_pNext; //pNext指向第个接点
while(m_pHead) //
{
delete m_pHead; //释放前一个
m_pHead = m_pNext ->m_pNext; //指针后移
m_pNext = m_pNext ->m_pNext; //指针后移
}
delete m_pHead; //如果头接点是new出来的。 如果初始化的时候就有了。就不用delete 了
}
}
//--------------
板凳
wwjxjj [专家分:760] 发布于 2007-12-25 16:05:00
还是不怎么明白。
是不是说应该从表头开始移动一下搜索指针然后删除指针指的节点,再移动指针再删除...?
还有,我在一个函数里new了个新节点插入链表,在整个程序退出时删除整个链表,但这个新的节点的申明超出了函数作用域啊,在退出程序的函数里删除这个链表是否会出错呢??
3 楼
yjlh1234 [专家分:420] 发布于 2007-12-26 15:27:00
是的。如果你的链表释放时需要delete 申请时需要new
那么一个链表的建立和释放需要花费很多时间。
所以我在游戏中的做法是使用内存池。 自己管理一大块内存。
这样把new / delete操作同一由一个类来管理。。
这样做好处是有很多的。当程序退出的时候统一释放。不会有内存泄露
4 楼
wwjxjj [专家分:760] 发布于 2007-12-27 08:28:00
谢谢你!虽然我还不怎么理解内存池,但你给我指明了学习的方向。还有我在游戏的构造函数里成功释放了链表,我是从尾节点开始释放的,用了两个指针,一个是要释放的节点的指针,另一个是记忆指针用于记住要释放的节点的前趋,最后释放掉头节点。
非常感谢你!
我来回复