免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ericqxf
打印 上一主题 下一主题

如何判断指针指向的内存是否被释放掉 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-04-30 11:01 |只看该作者
楼主想判断free是不是成功了,那你可以在free之后再引用那个指针,编译后执行
出现segamtation fault, 就说明free成功了.

论坛徽章:
0
22 [报告]
发表于 2006-04-30 11:41 |只看该作者
一般情况下都是错的。

FREE后继续使用一般不会SEGV,PAGEF


原帖由 rainfly100 于 2006-4-30 11:01 发表
楼主想判断free是不是成功了,那你可以在free之后再引用那个指针,编译后执行
出现segamtation fault, 就说明free成功了.

论坛徽章:
0
23 [报告]
发表于 2006-04-30 12:20 |只看该作者
同意思一克
据我所知的两个实现,重来不会出现SEGV

论坛徽章:
0
24 [报告]
发表于 2006-04-30 22:45 |只看该作者
原帖由 思一克 于 2006-4-30 11:41 发表
一般情况下都是错的。

FREE后继续使用一般不会SEGV,PAGEF



一般是不会,就像买彩票一样,一般不会中头奖,但若是多线程呢?我觉得若是发动全部门的同事都去买,而且还是复式的,中奖的几率还是蛮大的嘛

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
25 [报告]
发表于 2006-05-01 11:09 |只看该作者
原帖由 wingger 于 2006-4-29 11:08 发表
我比较同意 flw2 的说法。
不知道楼主为什么要这么做?
你自己释放了没释放你不想好,
就好像如何知道自己穿没穿内裤一样。

不论你穿没穿,你都是看不见的,唯一的办法只有脱了裤子看看,
而脱了裤子之后, ...


马甲都被你穿脏了。

论坛徽章:
0
26 [报告]
发表于 2006-05-01 21:03 |只看该作者

Re: 如何判断指针指向的内存是否被释放掉

原帖由 isnowran 于 2006-4-28 17:30 发表
自定义一个函数来保证指针释放后为空

  1. void Free( char*& p )
  2. {
  3.         if( NULL != p )
  4.         {
  5.                 free( p );
  6.                 p = NULL;
  7.         }
  8. }

  9. int main()
  10. {
  11.         char *p = (char*)malloc(10);
  12.         Free( p );
  13.         char * pp = p;
  14. }
复制代码

那还不如定义下面的宏:
#define Free(p) do { free(p); p = NULL; } while(0)
但解决不了楼主的问题, 我理解他真正的问题是类似这样的情形:

  1. extern char * global_p;
  2. int main()
  3. {
  4.     char *p = malloc(10);
  5.     global_p = p;
  6.     free(p);     //这里即使释放了, 或者再把p重设为NULL, 也不影响global_p中的值.
  7.     foo();
  8.     return 0;
  9. }
  10. void foo()
  11. {
  12.       if( global_p point to a valid memory or already be freed)
  13.      {... }
  14. }
复制代码


另一个办法是建立一个全局范围的表, 保存着所有分配过的内存地址, 每次分配就记上一笔, 每次释放就删掉它. 但代价可能稍大一些, 因为每次分配和释放都需要做这个表的维护工作:
附件里的代码提供了C标准库里 malloc, calloc, realloc, free 4个内存管理函数(注意象GCC的实现中提供的在栈上分配内存的alloca不是标准库中的函数, 因为它在栈上分配, 也不需要释放) 的包装版本, 另加上了一个
判断内存是否被释放的函数, 原型如下:

  1. void * my_malloc( size_t  size);
  2. void * my_calloc( size_t n, size_t size);
  3. void * my_realloc(void * const memblock, size_t size );
  4. int my_free(void * const p);
  5. int my_isok(void * const p);
复制代码

用以下的代码在GCC3.3.3和VC7下测试通过:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "my_mem.h"
  4. int main(int argc, char ** argv)
  5. {
  6.         char *p2;
  7.         char *p = my_malloc( 100 );

  8.         printf("%d \n", my_isok( p) );

  9.         *p2 = p;
  10.          my_free( p);
  11.         printf("%d \n", my_isok( p2 ) );

  12.         return 0;
  13. }
复制代码

[ 本帖最后由 slimzhao 于 2006-5-1 21:07 编辑 ]

my_mem.rar

1.07 KB, 下载次数: 65

跟踪内存使用的C包裹函数

论坛徽章:
0
27 [报告]
发表于 2006-05-02 00:28 |只看该作者
还真够土的方法,
正确答案察看Glibc mcheck, mprobe 相关函数,libc 库已经提供了完全的解决方案

论坛徽章:
0
28 [报告]
发表于 2006-05-02 21:36 |只看该作者
某些系统的libc不提供这两个函数...

论坛徽章:
0
29 [报告]
发表于 2006-05-02 23:00 |只看该作者

同意楼上的观点,

是的有的libc没有这两个函数的。
另外,我总结一下这个帖子,大家给各意见。
谢谢!

1、对于指针要注意不要用释放过的,这样我们可以让其free后总是为NULL,用时判断,也可保证没有二次free(二次free包括对于别指向同一个内存的指针的free)
2、对于内存来说,free之后在再次使用之前是没有变化的,但是free之后,在自己的进程空间里,以是不可用的了。
3、我们在编程时自己需要避免用另外的指针指向已经释放了的内存,这个可以通过两个方法实现:a,自己注意;b,用函数外包(如上)
4、 我还有一个问题就是,什么是智能指针,怎么用?有人可以告诉me吗 ??不甚感激!!!

论坛徽章:
0
30 [报告]
发表于 2006-05-03 00:11 |只看该作者
智能指针就是可以自己管理指针的生命周期的一种采用模板技术对指针的封装,属于C++里面的东西了.
可以看看这个:

http://www.jdzj.com/data/program/6736.htm
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP