如何释放已经创建过链表内存?换句话说就是销毁这个链表。 在网上看到,有的说得一个结点一个结点删除
发布网友
发布时间:2022-04-14 21:47
我来回答
共6个回答
热心网友
时间:2022-04-14 23:16
大致看了一下,你这个程序的问题是内存管理方面的问题。
而且你的程序在内存方面问题比较大。
1、一个临时对象开辟(new)了一个内存空间,没有及时释放,导致生命周期结束,最后没有就没有办法去释放掉;还有一个临时变量开辟了多次也没有释放。
比如 成员函数create(int n)中
LNode *p;
ElemType x;
int i=1;
while(i<=n)
{
cout<<"请输入第"<<i<<"个链表元素:";
cin>>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;
}希望可以帮到你.!
热心网友
时间:2022-04-15 00:34
需要一个节点一个节点的删除,因为这些节点都是你通过malloc函数动态分配的内存,程序不会自动收回。你只销毁头节点,只能说程序中不能再使用了。但其他节点所占的内存空间并没有释放,会造成内存泄露的。
热心网友
时间:2022-04-15 02:09
free(p)释放的是p指向的节点,而且仅仅是一个节点所占用的内存,如果p是链表的头指针,那么其余的节点(用malloc分配的内存)就成为*存了。要程序员自己管理程序分配的内存,是C++的一件麻烦事。如果用C#就省去这样的功夫了。
热心网友
时间:2022-04-15 04:00
除非有gc机制或者是局部堆分配的或者重复利用的等等, 不然要遍历```总之有内存泄露风险..
热心网友
时间:2022-04-15 06:08
遍历是肯定要的,然后逐个删除
热心网友
时间:2022-04-15 08:33
不能,必须遍历一遍,否则内存泄漏