malloc申请的内存free后为什么还可以访问呢?

blueandblue 2006-04-14 09:07:31
如下面的代码
main()
{
int* i=(int*)malloc(sizeof(int));
*i=12;
free(i);
printf("%d\n",*i);

}
  我想测试free的功能,虽然已经free了,但结果输出还是12,这是为什么呢?
...全文
596 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianyanzjq 2006-04-15
  • 打赏
  • 举报
回复
最好是添加上i=NULL;也就是说无论是free还是delete之后,都要让指针空.
pengcyu 2006-04-15
  • 打赏
  • 举报
回复
malloc申请的,请坚决用delete释放。
new深情的,请坚决用free释放。

哇,难道我学的一直是错的,书上的都错了?
blueandblue 2006-04-14
  • 打赏
  • 举报
回复
谢谢各位,我自己又找了一下,问题已经基本明白,我原来只是想弄明白free后系统到底做了什么,本来以为free后系统应该将该区域的数值置空,并禁止别人再次访问访区域,看来实际情况有点差异,现实情况是:系统只是将该区域标志为可再次使用而矣。
dsygr520yy 2006-04-14
  • 打赏
  • 举报
回复
看jjhou的书吧 赫赫


还有 把菜菜鸟拖出去重打30大板。

搞得我眼镜掉在地板上了,幸好有地毯。。。
yinqing_yx 2006-04-14
  • 打赏
  • 举报
回复
野指针撒 指到那里都是可能的~~~~~~~~~~~~
malloc(...)
free(...)
...=NULL;
晨星 2006-04-14
  • 打赏
  • 举报
回复
是啊,本来就是个简单的道理。
free的意思只是告诉系统:“我不要了”,除此之外没有任何别的意思,如果你理解成“我不要了,你锁起来吧”,那就是你误会了,free没那么我含义的。
如果你都说了不要了,还去访问,那不是你自己不厚道么?:)
Mypiger 2006-04-14
  • 打赏
  • 举报
回复
你住的房子卖了,如果你的买家没把锁换了,你还是可以开门进去!
如果换了你还要硬进去,你就危险了,可能你会被当左贼!
hazuki9902 2006-04-14
  • 打赏
  • 举报
回复
这里用free"释放"的意思是不是说该位置的内存可以供别的程序用,而并不是说该内存中的数据已经被销毁?就象平时malloc后发现申请的内存里有数据一样?
新手,学习...
anguofeng 2006-04-14
  • 打赏
  • 举报
回复
不好意思是i=NULL
anguofeng 2006-04-14
  • 打赏
  • 举报
回复
其实楼主你这样释放的并不完全
完全的释放是free以后还要把指针赋空的
比如*i=NULL;
chenming0321 2006-04-14
  • 打赏
  • 举报
回复
晕哦,
你用vc7,运行看看!!
iamcaicainiao 2006-04-14
  • 打赏
  • 举报
回复
让我神经都紧张了@@
---------------------------------------------------------------------------------
抱歉抱歉,一边跟pp女同事聊天,一边打字的,结果就错了,看来还是要专心啊。呵呵。
iamcaicainiao 2006-04-14
  • 打赏
  • 举报
回复
就是i是个地址,内存释放之后,那块内存自由了,但你的i此时,你没有赋值为NULL,所以它仍然指向那块内存(也许是随机的其他内存块?)。这样访问仍然是可以得了,但输出的未必就是12了,所以很危险。
只见烟火飞扬 2006-04-14
  • 打赏
  • 举报
回复
malloc申请的,请坚决用delete释放。
new深情的,请坚决用free释放。
-------------------------------------------
菜菜鸟你在说什么啊。-_-
-------------------------------------------

让我神经都紧张了@@

iamcaicainiao 2006-04-14
  • 打赏
  • 举报
回复
steedhorse(晨星) ( ) 信誉:145 2006-04-14 09:15:00 得分: 0


iamcaicainiao(菜菜鸟) ( ) 信誉:95 2006-04-14 09:11:00 得分: 0

malloc申请的,请坚决用delete释放。
new深情的,请坚决用free释放。
-------------------------------------------
菜菜鸟你在说什么啊。-_-

---------------------------------------------------------------------------------
抱歉抱歉,恰好说翻了。
malloc 配 free
new 和 delete结合



runtheway 2006-04-14
  • 打赏
  • 举报
回复
野指针i暂时指向的内存并没有被改变,所以值不变。
将指针置为空,就不会有问题了
free(i);
i = NULL;

晨星 2006-04-14
  • 打赏
  • 举报
回复
iamcaicainiao(菜菜鸟) ( ) 信誉:95 2006-04-14 09:11:00 得分: 0

malloc申请的,请坚决用delete释放。
new深情的,请坚决用free释放。
-------------------------------------------
菜菜鸟你在说什么啊。-_-


晨星 2006-04-14
  • 打赏
  • 举报
回复
因为你是在访问已经归还给系统我内存。
访问一下当然没什么问题,而且运气好的话,你说不定还能看到它原来的值,但问题是,没人给你这种保证,因为归还给系统的内存可能被重新分配和使用,一旦它被重新分配并使用过了,你要想再看到原来的值就不大可能了。
iamcaicainiao 2006-04-14
  • 打赏
  • 举报
回复
内存释放之后,并不代表指针为空了。也就是说,那块内存系统已经可以继续用在别处了(留用),但内存上曾经的东西未必不在了。所以,有的时候可能是12,有的时候可能已经是其他数据(垃圾数据)。
指针free或delete之后,请将指针赋值为null。
只见烟火飞扬 2006-04-14
  • 打赏
  • 举报
回复
什么编译器啊,我在VC6上运行后不是12
加载更多回复(3)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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