标题:[经验]ListInsert -> memory leak in "数据结构算法实现及解析—配合严蔚 ...
只看楼主
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
 问题点数:0 回复次数:3 
[经验]ListInsert -> memory leak in "数据结构算法实现及解析—配合严蔚敏_吴伟民

In the post《数据结构算法实现及解析》—配合严蔚敏_吴伟民编....jing314提供数据[长] [ 2 3 4 ], there is source code for ListInsert, which has a memory leak bug:

This statment returns ERROR before freeing allocated memory = memory leak

if(!p) /* i大于表长+1 */
return ERROR;



Sorry for working on system without Chinese input.



Status ListInsert(PNode *L, int i, ElemType e)
{ /* 在不带头结点的单链线性表L中第i个位置之前插入元素e */
int j=1;
PNode p=*L, s;

if(i<1) /* i值不合法 */
return ERROR;
s=(PNode)malloc(sizeof(struct Node)); /* 生成新结点 */
s->data=e; /* 给s的data域赋值 */
if(i==1) /* 插在表头 */
{
s->next=*L;
*L=s; /* 改变L */
}
else
{ /* 插在表的其余处 */
while(p&&j<i-1) /* 寻找第i-1个结点 */
{
p=p->next;
j++;
}
if(!p) /* i大于表长+1 */
return ERROR;
s->next=p->next;
p->next=s;
}
return OK;
}

[此贴子已经被作者于2007-6-10 6:53:25编辑过]

搜索更多相关主题的帖子: 吴伟民 严蔚敏 leak 数据结构 memory 
2007-06-10 06:43
wxj120bw
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-6-9
得分:0 
能否给出结构体的定义,总觉得是其他方面的问题.................
2007-06-10 08:32
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
以下是引用wxj120bw在2007-6-10 8:32:06的发言:
能否给出结构体的定义,总觉得是其他方面的问题.................

Memory leak is caused because we allocated memory but forget to deallocate it due to an exceptional case --- return ERROR.

The structure is defined as follows:

typedef int ELemType;

typedef struct Node
{
ElemType data;
struct Node* next;
} Node, *PNode;





I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-06-10 08:56
w273062425
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-5-20
得分:0 

最好试着建立一个头指针head
head=*L;
这样就比较清楚
Status ListInsert(PNode *L, int i, ElemType e)
{ /* 在不带头结点的单链线性表L中第i个位置之前插入元素e */
int j=1;
PNode head,p=*L, s;
head=p;
if(i<1) /* i值不合法 */
return ERROR;
s=(PNode)malloc(sizeof(struct Node)); /* 生成新结点 */
s->data=e; /* 给s的data域赋值 */
if(i==1) /* 插在表头 */
{
s->next=head;
head=s; /* 改变L */
}
else
{ /* 插在表的其余处 */
while(p&&j<i-1) /* 寻找第i-1个结点 */
{
p=p->next;
j++;
}
if(!p) /* i大于表长+1 */
return ERROR;
s->next=p->next;
p->next=s;
}
return OK;
}

2007-06-13 11:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-146279-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027467 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved