永发信息网

如何释放已经创建过链表内存?换句话说就是销毁这个链表。 在网上看到,有的说得一个结点一个结点删除

答案:6  悬赏:0  手机版
解决时间 2021-02-26 01:38
?;
}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->!!
最佳答案
需要一个节点一个节点的删除,因为这些节点都是你通过malloc函数动态分配的内存,程序不会自动收回。你只销毁头节点,只能说程序中不能再使用了。但其他节点所占的内存空间并没有释放,会造成内存泄露的。
全部回答
大致看了一下,你这个程序的问题是内存管理方面的问题。 而且你的程序在内存方面问题比较大。 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; } 希望可以帮到你.!
free(p)释放的是p指向的节点,而且仅仅是一个节点所占用的内存,如果p是链表的头指针,那么其余的节点(用malloc分配的内存)就成为泄漏的内存了。要程序员自己管理程序分配的内存,是C++的一件麻烦事。如果用C#就省去这样的功夫了。
除非有gc机制或者是局部堆分配的或者重复利用的等等, 不然要遍历```总之有内存泄露风险..
遍历是肯定要的,然后逐个删除
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; }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
香菜牛皮的做法,香菜牛皮怎么做好吃,香菜牛
新劳动法中“连续工作满十年”应该怎么理解?
滥竽充数滥的意思
在商品和服务市场上,竞争使经营者越来越认识
贷款怎么算月利息,如果贷五十万,等额本息,
石垭子地址有知道的么?有点事想过去
大埝路/郑田道(路口)这个地址在什么地方,我
包裹信件NE60200354044快递查询
请问,游戏现在还开着吗?在哪能下载客户端呀,
iPhone4怎么调整字体大小
万兴街三号院在什么地方啊,我要过去处理事情
中国周姓最多的村子
搅筑38平米房顶10公分厚需要多少水泥沙子石子
sisley全能乳液好不好
江苏正大天晴的医药代表待遇如何?
推荐资讯
合川大还是北碚大?
下垂眼线适合圆脸的人么?圆脸适合什么样的眼
开源超市在哪里啊,我有事要去这个地方
风色幻想5、风色幻想6 熟悉剧情的高手进!!
月经突然不正常,每天量很少,但是时间可以持
书香世家酒店在哪里啊,我有事要去这个地方
宏镇门业·装饰行在什么地方啊,我要过去处理
兴国县潋江一小六八班
How much does it weigh为毛不可以把does换成
那个长得和茶很象的字读什么
走马坪地址在什么地方,想过去办事
扶岜村地址有知道的么?有点事想过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?