标题:[求助] 不能使用 free 函数
只看楼主
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
以下是引用nuciewth在2006-12-12 22:28:22的发言:
free (p); 释放这个指针,也就说它从此不存在了。

不是释放P,而是释放P所占据的空间。换而言之,char *p 与 int i 一样,除非程序退出,否则始终存在。


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-12-13 08:55
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
再简单一点,你free(p)以后,你还可以重新再malloc,然后再free,再malloc。。。。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-12-13 08:57
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

指针所指指的地址返回给系统了
关于指针的其他的什么也不变,例如所指地方


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-12-13 09:11
lefttime
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-10-6
得分:0 

呵呵,没想到一个小小的问题引来大家议论,都怪我没解释啊
其实和版主说的一样
指针p还是存在的,它所指向也并没有变;
如果还有什么争议让我们做个测试:

......
int a=2;
int *p=&a;
free(p);
printf("%d",*p);
......
看了结果就知道啦


我是金子,我要闪光的
2006-12-13 13:59
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
以下是引用lefttime在2006-12-13 13:59:58的发言:

呵呵,没想到一个小小的问题引来大家议论,都怪我没解释啊
其实和版主说的一样
指针p还是存在的,它所指向也并没有变;
如果还有什么争议让我们做个测试:

......
int a=2;
int *p=&a;
free(p);
printf("%d",*p);
......
看了结果就知道啦

孺子不可教也


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-12-13 14:24
abcBoy
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-12-13
得分:0 
以下是引用lefttime在2006-12-13 13:59:58的发言:

呵呵,没想到一个小小的问题引来大家议论,都怪我没解释啊
其实和版主说的一样
指针p还是存在的,它所指向也并没有变;
如果还有什么争议让我们做个测试:

......
int a=2;
int *p=&a;
free(p);

......
看了结果就知道啦

操作系统回收空间后,并不一定也把该空间的内容都清掉...
而且你这个,free用得也不恰当,这算是哪门的例子

2006-12-13 14:41
lefttime
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-10-6
得分:0 
呵呵,前提我已经说明,不用再说了吧:其实可以不必非出现malloc才能用free

我是金子,我要闪光的
2006-12-13 17:33
abcBoy
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2006-12-13
得分:0 
以下是引用lefttime在2006-12-13 17:33:51的发言:
呵呵,前提我已经说明,不用再说了吧:其实可以不必非出现malloc才能用free
当然,出现realloc,calloc等也能用free,并不一定要malloc与free配对。
但你所提的例子也太离谱了吧,请恕我不给你面子,
局部变量所在的空间和动态申请的空间根本就不在一起,
也就是说,free释放的应该只是系统堆上的空间,而局部变量是从栈上创建的,它随着函数的结束空间也随着被回收,根本就不能被free掉
2006-12-13 18:16
lujunhuan
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-11-30
得分:0 

理解了!

2006-12-13 18:16
lefttime
Rank: 1
等 级:新手上路
帖 子:162
专家分:0
注 册:2006-10-6
得分:0 
以下是引用abcBoy在2006-12-13 18:16:06的发言:
当然,出现realloc,calloc等也能用free,并不一定要malloc与free配对。
但你所提的例子也太离谱了吧,请恕我不给你面子,
局部变量所在的空间和动态申请的空间根本就不在一起,
也就是说,free释放的应该只是系统堆上的空间,而局部变量是从栈上创建的,它随着函数的结束空间也随着被回收,根本就不能被free掉

呵呵,没事儿,三人行必有我师;谢谢你的提醒!


我是金子,我要闪光的
2006-12-13 18:41



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




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

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