| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1173 人关注过本帖
标题:大家出的题太难了,我说一个简单的供初学者联系 数7
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用有容就大在2012-1-21 11:13:05的发言:

谢谢你的讲解,我上面的程序是把循环链表逐个删除留下最后一个,那么每删除一个就应当释放一个申请的内存,如何做到删一个释放一个呢?
还有你说 free(p1);是p1指向的内存地址 并不是释放指针.  那么释放一个链表的头指针指向的内存地址是不是就能释放整个链表占据的内存?


从你问的问题可以看出来,你还真没有明白链表。。

比喻说
pMOLI 一个结构体的指针
tagMOLI 一个结构。
这里随便假设
Typedef struct tagMOLI
{
int x;//就含一个整数型的变量
struct tagMOLI *pTrNext;//一个简单指向下一个节点的结构指针
}*pMOLI,MOLI;
你MOLI p=(MOLI *)malloc(sizeof(tagMOLI))的内存是吧。


一般来说链表都会声明一个全局表结构变量head;
这里可以用很多方式。我就随便用一种.
MOLI head;//有很多方式。 你自己决定,我用我认为简单.

head.pTrNext 这个指向第二个节点指针.然后一个一个连下去 像串羊肉串一样的。
头节点和别的简单都差不多。就一个MOLI结构体。
每个节点就是一个结构体,用里面的成员变量指针联系起来。

所以 你是释放free(&head);
你只是释放head 这个结构内存 。
其他节点是你用malloc申请的内存,这些内存在逻辑上和头结点连起来的。
但实际上物理的内存地址是分开的,是任意分配的内存。

所以如果你你其他的内存没有释放 而释放头指针。
其他的节点就不能得到他们的内存地址。因为我们是通过头节点联系起别的节点的 这个你应该知道。
你这样就出现了内存泄露。这样的程序就想定时器诈弹一样一样的,随时可能爆炸。。
我以前觉得没有什么,现在有点感受到这点的可怕。内存这块确实非常重要,程序出现问题而在这块。很容易出现程序出现异常。

这样很危险的。
内存确实注意释放 虽然现在的内存比以前大多了,但我们知道 我们运行的程序也相应多了,而且可能很在内存。
这几天我用会声会影 制作视频的时候 2G的内存占到%80多了,有时候程序就异常关闭了 这样是相当恐怖的。
可能又要等30 40 分钟。。。
所以我们要注重内存这块 虽然现在我们写的程序比较小,但要时候我们写大程序的时候呢。。
这些是我不仅说给你听 也是说给我自己听的。。
没有别的意思 简单的简单交流自己的观点,希望你不要介意

用心做一件事情就这么简单
2012-01-21 17:25
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 21楼 小鱼儿c
也就是说在循环删除时,要预先用一个指针指向将要删除的环(链表的一个单元),删除后,释放掉。再设法用这个指针指向下一个,以便释放所有将要删除的环。最后还必须释放掉没删除的环从而保证内存不泄露。

梅尚程荀
马谭杨奚







                                                       
2012-01-22 05:13
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
以下是引用小鱼儿c在2012-1-21 17:25:36的发言:



从你问的问题可以看出来,你还真没有明白链表。。

比喻说
pMOLI 一个结构体的指针
tagMOLI 一个结构。
这里随便假设
Typedef struct tagMOLI
{
int x;//就含一个整数型的变量
struct tagMOLI *pTrNext;//一个简单指向下一个节点的结构指针
}*pMOLI,MOLI;
你MOLI p=(MOLI *)malloc(sizeof(tagMOLI))的内存是吧。


一般来说链表都会声明一个全局表结构变量head;
这里可以用很多方式。我就随便用一种.
MOLI head;//有很多方式。 你自己决定,我用我认为简单.

head.pTrNext 这个指向第二个节点指针.然后一个一个连下去 像串羊肉串一样的。
头节点和别的简单都差不多。就一个MOLI结构体。
每个节点就是一个结构体,用里面的成员变量指针联系起来。

所以 你是释放free(&head);
你只是释放head 这个结构内存 。
其他节点是你用malloc申请的内存,这些内存在逻辑上和头结点连起来的。
但实际上物理的内存地址是分开的,是任意分配的内存。

所以如果你你其他的内存没有释放 而释放头指针。
其他的节点就不能得到他们的内存地址。因为我们是通过头节点联系起别的节点的 这个你应该知道。
你这样就出现了内存泄露。这样的程序就想定时器诈弹一样一样的,随时可能爆炸。。
我以前觉得没有什么,现在有点感受到这点的可怕。内存这块确实非常重要,程序出现问题而在这块。很容易出现程序出现异常。

这样很危险的。
内存确实注意释放 虽然现在的内存比以前大多了,但我们知道 我们运行的程序也相应多了,而且可能很在内存。
这几天我用会声会影 制作视频的时候 2G的内存占到%80多了,有时候程序就异常关闭了 这样是相当恐怖的。
可能又要等30 40 分钟。。。
所以我们要注重内存这块 虽然现在我们写的程序比较小,但要时候我们写大程序的时候呢。。
这些是我不仅说给你听 也是说给我自己听的。。
没有别的意思 简单的简单交流自己的观点,希望你不要介意

看到小鱼儿的话,我觉得很好。我发现现在做应用程序开发的对内存不敏感,在论坛里说过一两次也没什么反应,所以想跟着强调一次,内存申请完,用完后如果没有用了一定要释放,举个例子,我做嵌入式,做设备,设备上也会放几个G的内存,看着挺多的,但是一但有个任务几百毫秒执行一次,每次泄漏几个字节的内存,设备交付给客户,过了几个月出现了异常情况,你光定位就要了命了,所以我那写了申请内存的代码都要经过大佬评审的,写出有内存泄漏的代码会被人鄙视,甚至年终考评都受影响,年终奖什么的。所以如果以后想做码农,还是要在早期养成良好的习惯,好了,不多说了,就再强调这一次了。以后不说了

总有那身价贱的人给作业贴回复完整的代码
2012-01-22 05:54
warrin
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2012-1-23
收藏
得分:0 
,,
2012-01-23 17:05
快速回复:大家出的题太难了,我说一个简单的供初学者联系 数7
数据加载中...
 
   



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

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