内存管理问题

xiaofeng_yan 2008-02-25 09:56:49
/*test.c*/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 16
int main ()
{
char *p;
p = malloc (SIZE*sizeof(char));
free(p);
p[0] = 'a';
printf("%c\n",p[0]);
return 0;
}


gcc test.c生成a.out
[yxf@localhost mem]$ ./a.out
a
这是什么原因,我已经在程序中先free了阿?
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpp520 2008-02-26
  • 打赏
  • 举报
回复
楼上说的很清楚了
zzyjsjcom 2008-02-25
  • 打赏
  • 举报
回复
free 后 最好把指针置空
zh1369 2008-02-25
  • 打赏
  • 举报
回复
没抱错 != 没有错。
p 好像叫 野指针了吧!
imasmallbird 2008-02-25
  • 打赏
  • 举报
回复
动态开辟并释放后,一定把指针清成NULL,否则有时就会出现这种情况,
楼上的几个说的十分详细了!!
sheenl 2008-02-25
  • 打赏
  • 举报
回复
非法使用内存, 又没说一定会崩溃,只是可能会崩溃。

jixingzhong 2008-02-25
  • 打赏
  • 举报
回复
要明白 free 动作, 它只是告诉系统,这块内存我(当前进程)使用完毕,可以收回并分配给其他进程使用。
这里有两点:
1 它不改写里面的值,所以暂时,还是 ‘a’
2 在没有被其他进程使用之前,访问这个内存空间不会有冲突

所以,在一定的几率下,free后依然可以获得 a 字符

但是这样的操作是无法保证其正确性的,
因为free后什么时候会被使用,被改写,都是无法预知的
Mnky 2008-02-25
  • 打赏
  • 举报
回复
C并不明确禁止use-after-free的情形(尽管这是一类很隐蔽而严重的错误)。这是因为C的malloc系列函数实际上是操作系统内存管理接口的一个封装,在free时,通常并不同时释放进程占用的内存页,相反,它仅仅将这部分内存在malloc内部结构中标记为可再分配。
如果有后续的内存访问,由于内存页仍然是可读写的权限,因此不致导致访问异常。然而,由于malloc已经不知道这部分内存仍在使用,因此,后续的malloc操作有可能将这部分内存再次分配给程序的其它部分使用。由于仍然保有指向此内存块的指针,程序将陷入十分危险的状态,有可能崩溃,也有可能表面上看什么事也没有。

建议:为防止非法使用free后的内存,最好在free(p)后加上p=NULL,这是个好习惯。
skefer 2008-02-25
  • 打赏
  • 举报
回复
是不是在
malloc (SIZE*sizeof(char));
前面加(char *),
因为malloc()的返回类型是void。
skefer 2008-02-25
  • 打赏
  • 举报
回复
free后是应该把指针置空
否则用if(p != NULL)
是无法判别野指针的
因为free()只是说p指向的内存是无用的(系统收回了此段内存)
但p并不是NULL

69,382

社区成员

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

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