回 帖 发 新 帖 刷新版面

主题:建立链表后,VC调试出现内存泄露。怎样解决?(加分)

刚自学了数据结构的单向链表,在实际运用中我建立了一个带表头监督元的单向链表,并实现插入新节点和删除指定节点的操作,可是运行VC后却发现有内存泄露!我想应该是 new了节点后没有在退出程序时释放的结果,那不就是说应该释放整个链表归还堆内存?可是书上没有说是否应该怎样和怎样释放整个链表。请各位好心人帮帮忙,期待你的回复,非常感谢!

回复列表 (共4个回复)

沙发

我来沙发?。。。呵呵
//------------
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 了
   }
}
//--------------

板凳

还是不怎么明白。
是不是说应该从表头开始移动一下搜索指针然后删除指针指的节点,再移动指针再删除...?
还有,我在一个函数里new了个新节点插入链表,在整个程序退出时删除整个链表,但这个新的节点的申明超出了函数作用域啊,在退出程序的函数里删除这个链表是否会出错呢??

3 楼

是的。如果你的链表释放时需要delete 申请时需要new 
那么一个链表的建立和释放需要花费很多时间。
所以我在游戏中的做法是使用内存池。 自己管理一大块内存。
这样把new / delete操作同一由一个类来管理。。
这样做好处是有很多的。当程序退出的时候统一释放。不会有内存泄露

4 楼

谢谢你!虽然我还不怎么理解内存池,但你给我指明了学习的方向。还有我在游戏的构造函数里成功释放了链表,我是从尾节点开始释放的,用了两个指针,一个是要释放的节点的指针,另一个是记忆指针用于记住要释放的节点的前趋,最后释放掉头节点。
非常感谢你!

我来回复

您尚未登录,请登录后再回复。点此登录或注册