C中的free()函数问题!

wxt2301 2003-09-17 07:34:31
以下代码
---------------------------------------------
int *p;
p=(int *)malloc(sizeof(int));
*p=2;
free(p);
---------------------------------------------
free后,p还存在吗,它原先所指的内容(也就是2)是否立即消失(比如清零什么的),还是直到下一次被覆盖?
...全文
983 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaonanln 2003-10-06
  • 打赏
  • 举报
回复
获益匪浅
nazha 2003-10-06
  • 打赏
  • 举报
回复
p这个指针存在,但是他所指向的地址是无意义的,称为野指针,存在系统崩溃隐患,建议释放后指针=NULL.
Wolf0403 2003-10-03
  • 打赏
  • 举报
回复
呵呵,楼上几位都如此风趣幽默,确实令人折服。
其实呢,释放指针 (free(p)) 之后呢,应该立刻重新分配 (malloc) 以再度使用,否则就应该置 NULL。这样,我们可以在使用的时候通过一个简单的 assert(p) 来判断 p 是否可用:如果 p == NULL 则 assert 会中断执行;即使没有 assert,解除引用也会失败。如果没有把指针归 NULL,则 assert 无法检测失效的指针,如果有非法使用的情况,在“长时间运行的或者是交互式程序中”(出自《C++沉思录》^_^)会导致一堆莫名其妙的错误而且无法有效 debug。
另外,VC7.1 不管是 debug 还是 release, free 都会重写指针指向的内存【我用一个 int* 试验的】
TianGuangZao 2003-10-03
  • 打赏
  • 举报
回复
BinaryWorld(忠诚) 和 Darkay_Lee() 讲的都很好,一个指明原理,一个例子很形象,受益。

我也举个例子:
这里管家摇身一变成了房东,经营一个旅店,堆里的内存就是可供出租的房间,占用块表示已经出租的房间,空闲块表示等待出租的房间。这些都归房东管。
客人要求订房,先办理订房的手续(malloc),退房 (free)同样也要办理手续,以便及时腾出房间。
int *p = (int *)malloc (10 * sizeof(int));
10 * sizeof(int) 房间大小,理解成单间,双人间,豪华套房。
指针 p 即房间的钥匙。客户通过这把钥匙来使用房间。
旅店有个不成文的规定,客人离开(free)后,钥匙可以带走,也就是钥匙不归旅店管,由客人自行处理。
显然这种规定在现实是多么的愚蠢。人分三六九等:
善良的人们在离开(free)后, 自觉的把钥匙里激光镭射码(很先进)抹掉(p = NULL),钥匙继续带在身边,不过它已经不能开启房间的门。
居心叵测的人,如小偷,可以通过这把钥匙自由的出入房间,把本该不属于他的东西拿走,或安装窃听器,当然也有可能只是来带走他上次遗留下来的半只拖鞋(以上归纳为纂改数据)。
有时候也不免忘了处理钥匙,你可能认为我不用它就没事了!
不要太乐观,假如你有梦游症,再毫不知情的情况下,入侵了旅店房间(无意修改了已经 free 后的内存空间)。
不管如何这种行为很可能使新住进来的客户蒙受不同程度损失(最严重系统崩溃)。

所以在这里我们一定要教育好每个公民,努力提高自身素质,避免违法犯纪的行为发生。
junmayang 2003-10-03
  • 打赏
  • 举报
回复
free(p)后,变量p的值仍然是原来的地址值,p所指的内存的内容也不会变直到下一次用到这块内存。但这块内存不能用p来操作了,因为这段内存是活动的了,直到下一次再被用到。
robbierao 2003-10-01
  • 打赏
  • 举报
回复
free是让p没法用了,p = NULL是让p为空,通常没有家p = NULL的必要。
Darkay_Lee 2003-10-01
  • 打赏
  • 举报
回复
打个比方:
CRT的内存管理模块是一个管家。
你的程序(简称“你”)是一个客人。
管家有很对水桶,可以用来装水的。
malloc的意思就是“管家,我要XX个水桶”。
管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。
free的意思就是说:“管家我用完了,还你!”。
至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。
管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。
free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,^_^
如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满,杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。
lyr311 2003-09-30
  • 打赏
  • 举报
回复
向高手学习!
Wolf0403 2003-09-30
  • 打赏
  • 举报
回复
LoopyPuzzle:
比丢失可怕,“泄露”了。
19830711 2003-09-30
  • 打赏
  • 举报
回复
释放空间
LoopyPuzzle 2003-09-30
  • 打赏
  • 举报
回复
如果说使用malloc分配后不用free释放直接p=Null的话,那块被分配的内存就没有人可以使用了,直到整个程序完全结束被系统释放。也就是说,在这之间,这块内存就丢失了。
mfcer2 2003-09-30
  • 打赏
  • 举报
回复
p还在,但所指的int大小的内存已经没有了.
xhj10 2003-09-30
  • 打赏
  • 举报
回复
free(p)之后p=NULL;
比较安全
playboyxp 2003-09-29
  • 打赏
  • 举报
回复
刚开辟的内存还在
但p=NULL了,不指向任何东西
那块内存谁都可以用
BinaryWorld 2003-09-29
  • 打赏
  • 举报
回复
同意,把分配权交给堆管理模块而不是OS。

所偎的动态堆内存,是有系统所维护的堆内存管理模块,按照堆算法,进行收回和分配动态内存的。如果有合适的内存被分配给应用程序的话,那么应用程序有这些内存的使用权,例如:
int *p = NULL;
p = (int *)malloc(sizeof(int)*N);
如果分配不成功p的值不会被修改,这就是
if(p == NULL)
{
return;
}
这个语句的理由。

当使用完后,良好的C++程序员应该使用free()将其释放,并让指针=NULL。释放后该内存的使用权限会管理模块,所以,不能保证这段内存的值的问题,可能被修改了,也可能被别的线程或你的下一次操作所占用了。

Java程序员从来不考虑这个问题,Java会在变量注销或析构的时候自己释放动态内存部分。所以,Java面临的问题是,只要声明的内存,就会一直存活下去。所以,Java会有一个GC系统。

顺便说一下,在操作系统里面,因为有内存换页,虚拟内存的技术,内存空间可能会到很大,但速度会下降,具体就是根据,所有进程使用的总内存和/实际内存 得到的数值的 倒树*物理内存的速度。所以,一般不会出现,内存分配不成功,但对于动态内存是否分配成功的检验,是一个良好程序员的正确风格。这点可以参考高质量C++编程。
fogeye 2003-09-29
  • 打赏
  • 举报
回复
它的值是未定义
Wolf0403 2003-09-29
  • 打赏
  • 举报
回复
永不死机:不会。那个内存是僵死的,系统不会再次分配出去。
Wolf0403 2003-09-19
  • 打赏
  • 举报
回复
可以加上 p = NULL;,效果一样。
Wolf0403 2003-09-19
  • 打赏
  • 举报
回复
zk635(小文)
试试这个:
int main()
{
void* p;
while(1)
{
p = malloc(1);
}
}
step_by_step 2003-09-18
  • 打赏
  • 举报
回复
p的值还在,但是p所指向的地址的内容已经变了。
所以每次free(p)之后,都应该p = 0;
加载更多回复(9)

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧