为什么malloc申请的空间free后,指针变量的地址还存在??而且还能再次使用?如果一直malloc,free,那岂不是最后内存也会用尽???

好了么 2020-04-20 10:43:46


上面的代码运行后,已经把malloc的空间free了,但是p的地址还是没变,那是不是说明,还占有内存??
可能我一开始就想错了,求指点!!
...全文
870 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tobybo 2020-04-21
  • 打赏
  • 举报
回复
1.free 和 delete 内存释放是释放的指针指向的内存, 指针本身不会被你释放,在这里指针本身属于自动变量,会在程序块执行完后释放内存; 2.释放只是那块内存可以用作其他,并不会主动给你清理内存的数据,所以每次申请内存后最好设置一下初始值来覆盖以前的值; 3.p 指向的内存被释放了,但是你还可以利用p来操作那块地址,虽然可行,但这是一个未定义的操作,危险的操作,即访问一块未分配的内存空间,这里没出问题因为你刚分配过,释放后接着访问,而且只访问int大小的空间,如果你执行 *(p++) 之类的操作就可能引发严重的问题; 所以一般 释放指针指向的内存后 需要 p = NULL; 来将指针指向NULL 表示以前那块内存不再可用。 野指针 百度百科: 野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。 指针变量未初始化 任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。如果没有初始化,编译器会报错“ ‘point’ may be uninitializedin the function ”。 指针释放后之后未置空 有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
u俺的me 2020-04-21
  • 打赏
  • 举报
回复
楼上正解,说得很详细了,释放之后逻辑地址依然在那,只是你不应该人为去修改它,应该交由操作系统管理,后续再malloc使用,但是不能保证下次malloc到的一定是这个地址,不过对于用户来说这个并不重要,毕竟是逻辑地址而不是物理地址。
arfi 2020-04-21
  • 打赏
  • 举报
回复
通常我们访问的逻辑地址,你申请或者不申请,地址都在那里,你就可以往里面放东西。

但是,你得知道该地址是个有效地址,否则就可能程序崩溃(比如,你往地址为1的内存写入东西)

内存释放后,当前没有别人在用它,所以你仍然用了,但是这算是非法访问。针对多线程的程序来说,可能别人把这个内存地址刚给申请了,而你改写了他的东西,就会导致他那边出异常。

70,037

社区成员

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

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