读书人

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

发布时间: 2013-02-17 10:44:46 作者: rapoo

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里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

读书人网 >C++

热点推荐