别名引用的链表头结点如何回收?

xuanner 2008-10-12 09:51:22
问题是:
如果用free,是会出现野指针,因为Lb不是通过malloc申请的,不存在堆内存中。
但它是通过&,别名指定的,是一个特殊的指针,内存空间是在哪里申请的呢?应该如何回收呢?
或是说会自动回收呢?如果自动回收了,怎么在main里又可以调用显示呢,所以是没有回收。
请问下这个头结点如何回收?谢谢...代码如下


#include <iostream>

struct LNode
{
int data;
struct LNode *next;
};

void createList(LNode &pHead, int n)
{
int i;
LNode *p,*q;
p=&pHead;
for(i=1; i<=n; i++)
{
q=(LNode *)malloc(sizeof(LNode));
memset(q,0,sizeof(q));//清空节点空间
printf("输入数据:");
scanf("%d",&q->data);
//尾插入算法
q->next=NULL;
p->next=q;
p=q;
}
}

void dispList(LNode &pHead)
{
LNode *p=pHead.next;
while(p)
{
printf("%d\n",p->data);
p=p->next;
}
}

//通过原结点的链表合并
void MergeList(LNode &La, LNode &Lb, LNode &Lc)
{
LNode *ap,*bp,*cp,*tp;
ap=La.next;
bp=Lb.next;
cp=&La; Lc=La;
tp=&Lb;
while(ap&&bp)
{
if(ap->data<bp->data)
{
cp->next=ap; cp=ap; ap=ap->next;
}
else if(ap->data>bp->data)
{
cp->next=bp; cp=bp; bp=bp->next;
}
else
{
cp->next=ap; cp=ap;ap=ap->next;
//释放Lb中的节点空间
tp->next=bp->next; free(bp); bp=tp->next;
}
}
cp->next=ap?ap:bp;
//问题:回收链表Lb的头结点空间
//如果用free,是会出现野指针,因为Lb不是通过malloc申请的,不存在堆内存中。
//但它是通过&,别名指定的,是一个特殊的指针,内存空间是在哪里申请的呢,应该如何回收呢?
//或是说会自动回收呢,如果自动回收了,怎么在main里又可以调用显示呢,所以是没有回收。
//请问下这个头结点如何回收,谢谢?
}

int main(void)
{
LNode m_pHead1,m_pHead2,m_pHead3;//已经带有头结点
printf("链表1\n");
createList(m_pHead1,5);
printf("链表2\n");
createList(m_pHead2,5);
printf("合并链表数据\n");
MergeList(m_pHead1,m_pHead2,m_pHead3);
dispList(m_pHead3);
return 0;
}
...全文
157 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chlaws 2008-10-12
  • 打赏
  • 举报
回复
靠 我以为回收结点呢 原来你问回收头结点 我晕
xuanner 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chlaws 的回复:]
m_pHead2 是在栈上 单你看下你要删的是结点 都是malloc出来的。。。 而m_pHead2 不过是指向那些堆上分配出来已经链接在一起的结点
[/Quote]
chlaws 说法是没错,但没有回答我问的问题?

既然Lb是栈内存分配的,应该是在main函数结束时生命周期结束时,自动回收的,所以不用理会它。
谢了,一楼matrixdwy。现在散分结贴。
luxiaoxun 2008-10-12
  • 打赏
  • 举报
回复

void ListDestroy(LNode* &L)// 销毁链表,传入的是指针
{
LNode* p;
p=L;
while(L)
{
L=p->next;
free(p);
p=L;
cout<<"free memory"<<endl;
}
}


有几个malloc就要有几个free
luxiaoxun 2008-10-12
  • 打赏
  • 举报
回复
你的Lb所引用的m_pHead2是分配在栈内存上的,是不错,不过你也没有给它分配内存啊(是节点又不是指针,好好看看你的程序),你回收它干什么?系统会做的
chlaws 2008-10-12
  • 打赏
  • 举报
回复
m_pHead2 是在栈上 单你看下你要删的是结点 都是malloc出来的。。。 而m_pHead2 不过是指向那些堆上分配出来已经链接在一起的结点
xuanner 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chlaws 的回复:]
Lb 就是m_pHead2 怎么不是在堆中得到的?
而且lb不错就一别名 你删它和删实际的是一样的,
再就是野指针 的产生是free后没有对指针制为NULL 你加上这就不会产生野指针了
[/Quote]
Lb所引用的m_pHead2是分配在栈内存上的,不是堆内存,只有通过malloc或是new,才会分配在堆内存中的。
xuanner 2008-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 matrixdwy 的回复:]
你应该弄一个函数专门用来遍历链表并释放空间的,比如
void purge(Node& node) {
//一边遍历,一边free掉next指针
}
Lb你就放着好了,不要管他,他是一个在栈上的对象,会自己析构的
[/Quote]
其实这里就是释放空间了:

else
{
cp->next=ap; cp=ap;ap=ap->next;
//释放Lb中的节点空间
tp->next=bp->next; free(bp); bp=tp->next;
}

只是头结点没有释放罢了。我自已想别名也应该是在栈上分配的。
chlaws 2008-10-12
  • 打赏
  • 举报
回复
再呢?
怎么不说问题。。。
xuanner 2008-10-12
  • 打赏
  • 举报
回复
创建的两个链表都得是有序的...
例如:
La===> 1 2 3 4 5
Lb===> 2 4 6 8 10
合并后就是1 2 3 4 5 6 8 10
chlaws 2008-10-12
  • 打赏
  • 举报
回复
Lb 就是m_pHead2 怎么不是在堆中得到的?
而且lb不错就一别名 你删它和删实际的是一样的,
再就是野指针 的产生是free后没有对指针制为NULL 你加上这就不会产生野指针了
matrixdwy 2008-10-12
  • 打赏
  • 举报
回复
你应该弄一个函数专门用来遍历链表并释放空间的,比如
void purge(Node& node) {
//一边遍历,一边free掉next指针
}
Lb你就放着好了,不要管他,他是一个在栈上的对象,会自己析构的

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧