免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3616 | 回复: 6
打印 上一主题 下一主题

[C] C语言:如何判断指针指向的存储单元已被free [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-18 10:12 |只看该作者 |倒序浏览
下面是个示例:
1  main()
2  {
3   struct tt
4   {int a;
5    int b;
6   };
7   struct tt * c;
8   struct tt * d;
9   c=malloc(sizeof(struct tt));
10 d=c;
11 free(c);
12 free(d);
}
运行到12 行会出错,因为分配的存储单元在11行已经释放。所以我想请教大家有没有办法在free执行前判断指针指向的存储单元已被释放。

论坛徽章:
0
2 [报告]
发表于 2007-06-18 10:18 |只看该作者
不存在有效的判断方法。然而最简洁有效的避免方法是在指针对应的存储区域被释放后立即将指针设置为 NULL。

论坛徽章:
0
3 [报告]
发表于 2007-06-18 10:22 |只看该作者
一个好的习惯是,
声明指针后,将其初始化为NULL
每次操作指针前,检查指针是否为NULL
free之后接着将指针赋为NULL



原帖由 ggnew 于 2007-6-18 10:12 发表
下面是个示例:
1  main()
2  {
3   struct tt
4   {int a;
5    int b;
6   };
7   struct tt * c;
8   struct tt * d;
9   c=malloc(sizeof(struct tt));
10 d=c;
11 free(c);
12 free(d);
}
运行 ...

论坛徽章:
0
4 [报告]
发表于 2007-06-18 10:28 |只看该作者
不过设置为NULL似乎还不行。

还是用上面的程序。
在 free(c) 之后 我加上
   c=NULL;
但是d指向的地址并没有改变,而且d!=NULL, *d!=NULL.

有没有从free函数本身出发的方法,例如捕捉free的出错信息,然后判断?

论坛徽章:
0
5 [报告]
发表于 2007-06-18 10:31 |只看该作者
It's impossible!

原帖由 ggnew 于 2007-6-18 10:28 发表
不过设置为NULL似乎还不行。

还是用上面的程序。
在 free(c) 之后 我加上
   c=NULL;
但是d指向的地址并没有改变,而且d!=NULL, *d!=NULL.

有没有从free函数本身出发的方法,例如捕捉free的出错信息,然 ...

论坛徽章:
0
6 [报告]
发表于 2007-06-18 11:12 |只看该作者
所以有时为了避免这些麻烦,大点的程序都会写一套用链表或其它结构来管理内存申请,统一申请统一释放,就不会了.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2007-06-18 11:12 |只看该作者
原帖由 langue 于 2007-6-18 10:18 发表
不存在有效的判断方法。然而最简洁有效的避免方法是在指针对应的存储区域被释放后立即将指针设置为 NULL。

不存在可移植的判断方法罢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP