首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++链表内存管理有关问题

2013-02-17 
C++链表内存管理问题free链表内存空间出现内存损坏错误。#include IOSTREAMusing namespace stdstruct W

C++链表内存管理问题
free链表内存空间出现内存损坏错误。


#include <IOSTREAM>
using namespace std;
struct WitsData
{
int C1,
C2,
C3,
nC4,
iC4,
iC5,
nC5,
CO2;

    double TotDepth,
   TvdDepth;
};

//定义结点类型
typedef struct WitsDataNode
{
WitsData data;
WitsDataNode *next;
}*LWitsData;

//定义链表类型
typedef struct 
{
LWitsData head,
      tail;
int       len;
}WitsLinkList;

LWitsData MakeNode(const WitsData wd); //分配由p指向的值为wd的节点
void FreeNode(LWitsData p); //释放P指向的节点
void InitList(WitsLinkList &wll); //构造一个空的线性链表
void ClearList(WitsLinkList &wll);  //清空链表并释放原节点的空间
void AppendNode(WitsLinkList &wll,LWitsData lwd); //在链表的末尾添加节点
LWitsData AccessNode(WitsLinkList &wll,int n); //访问链表中的第N个节点

int main()
{   
WitsData  wd={1,2,3,4,5,6,7,8,9,10};
    WitsLinkList wll;
InitList(wll);
cout<<wll.len<<endl;
for (int i=0;i<6;i++)
{
       LWitsData p=MakeNode(wd);
   AppendNode(wll,p);

}
    cout<<wll.head->data.C1<<endl;
cout<<wll.len<<endl;
LWitsData q=AccessNode(wll,2);
ClearList(wll);
cout<<wll.len<<endl;
return 0;
}

LWitsData MakeNode(const WitsData wd)
{   
LWitsData p=(LWitsData)malloc(sizeof(WitsDataNode));
p->data=wd;
p->next=NULL;
return p;
}

void FreeNode(LWitsData p)
{
p->next=NULL;
p=NULL;
free(p);
}

void InitList(WitsLinkList &wll)
{   
wll.head=NULL;
wll.tail=NULL;
    wll.len=0;
}

void ClearList(WitsLinkList &wll)
{
if (wll.len>0)
{  
       WitsDataNode *p=NULL;
       for (int i=0;i<wll.len;i++)
       {
           if (wll.head!=wll.tail)
           {
              p=wll.head;
  wll.head=wll.head->next;
  free(p);
  p->next=NULL;
  p=NULL;
           }
   else
   {
              p=wll.head;
  free(p);
  p->next=NULL;
  p=NULL;
   }
       }
   wll.head=NULL;
   wll.tail=NULL;
   wll.len=0;
}
else
{   
return ;
}
}

void AppendNode(WitsLinkList &wll,LWitsData lwd)
{   
if (wll.head!=NULL)
{
       wll.tail->next=lwd;
   wll.tail=lwd;
   wll.len++;


}
else
{
wll.head=lwd;
wll.tail=lwd;
wll.len++;
}
return ;
}

LWitsData AccessNode(WitsLinkList &wll,int n)
{   
if (n>wll.len||n<1)
{
return NULL;
}
    LWitsData p,head=wll.head;

for (int i=0;i<n;i++)
{
p=wll.head;
wll.head=wll.head->next;
}
wll.head=head;
return p;
}


请教大神如何解决内存释放问题
[解决办法]
引用:
我只想知道为什么free的时候会出现内存错误,调试的时候clearlist里面的free(p)里面的地址是正确的

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

热点排行