如何释放已经创建过链表内存?换句话说就是销毁这个链表。 在网上看到,有的说得一个结点一个结点删除
解决时间 2021-02-26 01:38
- 提问者网友:我没有何以琛的痴心不悔
- 2021-02-25 01:25
?;
}lnode,*linklist;
void create_list1(linklist &l)
{
int n;
lnode *p;
l=(lnode*)malloc(sizeof(lnode))??;
/????;<!=NULL)
{
cout<:"--i)
{
p=(lnode*)malloc(sizeof(lnode));data;
p->next=l->>//next;
while(p;0;/建立一个带头结点的链表
cout<<"链表结点数:";;
cin>>number??;
distory(list);p->/int ip;
lnode *p????;
cin>??;endl;
print(list);
}
}/
#include l->next=p;
for(int i=n;i>/;
//int data??;//number;i++)
{
p=(lnode*)malloc(sizeof(lnode));
cout<<"Input the data;next=NULL;<;
cin>生成新节点
}
}
void create_list(linklist &l)
{
/??;
create_list(list);
cout<??;p->end of print
///create a linklist with a header
int number:"iostream>??;试着通过释放头指针检验能不能销毁链表
}
//elemtype elem;
linklist list;}//
/?
/"
cout<<"Input the number;/int dp;
using namespace std;>/销毁链表函数
void distory(linklist &list)
{
free(list)??;?;
//end of create_list
void print(linklist &l)
{
lnode *p;
p=l->/int po??;data<
#define elemtype int
typedef struct lnode
{
elemtype data; "; //?
void main()
{
/有的网友说只要释放链表头指针就可以啦;
l->next=NULL;/
p=p->????;next;
}
cout<,小弟不胜感激!??,本人在正在纠结中,希望热心网友帮忙解答疑惑!
如下是一些代码
#include<??;
struct lnode *next;n;
for(int i=0;i<
l=(lnode*)malloc(sizeof(lnode));
l->!!
最佳答案
- 五星知识达人网友:零点过十分
- 2021-02-25 02:11
需要一个节点一个节点的删除,因为这些节点都是你通过malloc函数动态分配的内存,程序不会自动收回。你只销毁头节点,只能说程序中不能再使用了。但其他节点所占的内存空间并没有释放,会造成内存泄露的。
全部回答
- 1楼网友:酒醒三更
- 2021-02-25 06:39
大致看了一下,你这个程序的问题是内存管理方面的问题。
而且你的程序在内存方面问题比较大。
1、一个临时对象开辟(new)了一个内存空间,没有及时释放,导致生命周期结束,最后没有就没有办法去释放掉;还有一个临时变量开辟了多次也没有释放。
比如 成员函数create(int n)中
LNode *p;
ElemType x;
int i=1;
while(i<=n)
{
cout<<"请输入第"<>x;
p=new LNode;//这里开辟了空间,后面没有释放
p->data=x;
p->next=head->next;
head->next=p;
i++;
}
临时变量p开辟了多次内存,每次都没有释放。
解决方法,可以考虑用成员指针变量pNode替代局部需要开辟的内存的地方。
2 内存管理另一个有效解决方法是。
在一个指针变量(比如 LNode * pNode )初始化的时候指向NULL,
new 和delete要配套使用,delete之后试该指针指向NULL,这样就可以避免被删掉的指针再次被删掉。
例如:
LNode *pNode=NULL;
//........函数代码
pNode=new LNode();//这里开辟给pNode开辟空间之后,pNode就不指向NULL了
//......函数代码
if(pNode!=NULL)//如果不指向NULL就执行下面代码
{
delete pNode;//如果开辟了数组空间就delete []pNode;
pNode=NULL;
}
希望可以帮到你.!
- 2楼网友:拾荒鲤
- 2021-02-25 05:48
free(p)释放的是p指向的节点,而且仅仅是一个节点所占用的内存,如果p是链表的头指针,那么其余的节点(用malloc分配的内存)就成为泄漏的内存了。要程序员自己管理程序分配的内存,是C++的一件麻烦事。如果用C#就省去这样的功夫了。
- 3楼网友:神也偏爱
- 2021-02-25 04:50
除非有gc机制或者是局部堆分配的或者重复利用的等等, 不然要遍历```总之有内存泄露风险..
- 4楼网友:痴妹与他
- 2021-02-25 04:18
遍历是肯定要的,然后逐个删除
- 5楼网友:夜余生
- 2021-02-25 03:09
bool linearlist::remove(const int data)
{
node curr;
node prev;
if (isempty())
{
std::cout << "can not remove! empty!" << std::endl;
return false;
}
else if (_first->data == data)
{
curr = _first;
_first = _first->next;
delete curr;
_length--;
return true; //<---这里有问题,如果第一个节点符合条件,删除后会跳退函数
//不再查找后面符合条件的节点,从你的问题来看,似乎
//想把链表中所有符合条件的节点都删了
}
else
{
for (curr = _first, prev = null;
curr != null; prev = curr, curr = curr->next)
// 不能直接用curr=curr->next循环赋值,否则当curr被释放后,
// curr->next引用会出错.
{
if (curr->data == data)
{
prev->next = curr->next;
// 在使用prev指针前必须判断它是否为null,否则会出现运行时错误
_length--;
// <----这里有问题,找到符合条件的节点没有对应的删除操作
}
}
// <---这里必须添加一行判断,如果不为null才能释放
delete curr; // 否则会出现释放null指针出错
return true;
}
}
// 修正如下,没有测试,请自行调试:
bool linearlist::remove(const int data)
{
node curr;
node prev;
bool bret = false;
if (isempty())
{
std::cout << "can not remove! empty!" << std::endl;
return bret;
}
else
{
for (curr = _first, prev = null;
curr != null; )
{
if (curr->data == data)
{
if (curr == _first ) _first = curr ->next;
if (prev != null ) prev->next = curr->next;
_length--;
delete curr;
bret = true;
if (prev != null ) curr = prev->next;
else curr = _first;
}
else
{
prev = curr;
curr = curr->next;
}
}
}
return bret;
}
我要举报
大家都在看
推荐资讯