免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2006-05-03 09:55 |只看该作者
原帖由 cglxa 于 2006-5-2 23:00 发表
2、对于内存来说,free之后在再次使用之前是没有变化的,但是free之后,在自己的进程空间里,以是不可用的了。


这一点比较重要。

论坛徽章:
0
32 [报告]
发表于 2008-08-06 15:54 |只看该作者
很好啊,例子的思路不错


原帖由 slimzhao 于 2006-5-1 21:03 发表

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

extern char * global_p;
int main()
{
    char *p = mal ...

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
33 [报告]
发表于 2008-08-06 16:16 |只看该作者


#ifdef DEBUG

#define POINT_NORM      0xcccccc  //指针正常
#define POINT_DELETED 0x0         //指针已删除

void * _malloc_(size_t size)
{
    void *p = malloc(size + 4); //多分配4个字节以夹带私货
    if  (p != NULL)
    {
        ((int*)p)[0] = POINT_NORM;   //前4个字节写入正常标记
        return p+4;
    }
    return p;
}

void _free_(void * p)
{
    if (p == NULL) return;  //删除空指针直接返回
    assert( *((int *) (p-4)) == POINT_NORM);  //assert错误说明指针已删除

   *((int *) (p-4))  = POINT_DELETED;  //置删除标记
   free(p-4);     //释放内存
}

#else

#define _malloc_ malloc
#define _free_ free

#endif

[ 本帖最后由 shan_ghost 于 2008-8-6 16:25 编辑 ]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
34 [报告]
发表于 2008-08-06 17:04 |只看该作者
上面这个实现99%情况下都能正确工作;但还是无法应付如下情况:

1、内存已释放,但又被后面的代码用_malloc_申请到,且起始位置和上次申请时正好相同(即未发生内存合并);

2、内存已释放,但又被后面的代码申请到,且新写入标志位4个单元的数据刚好是0xcccccccc。

其中,1没有简单的办法可以解决;2可以通过加长标志位、精心选择程序中不太可能出现的特殊数字(比如0xcccccccc就不错^_^)解决。

另外,4是魔幻数字,为了某种洁癖,应该换成sizeof(int)——当然,赋值部分也要改成memset(p,oxcc,sizeof(int))。

论坛徽章:
0
35 [报告]
发表于 2008-08-06 17:35 |只看该作者
原帖由 ericqxf 于 2006-4-28 17:11 发表
我的意思不是free是否成功。我的意思是比如有多个指针同时指向了一块内存,然后通过一个指针将其释放,这样我如何根据另外的指针判断出这块内存已经释放呢?
比如:
    char *p = malloc(10);
      char * ...



lz的问题好像是个逻辑错误,通过malloc分配的内存,如果不释放,程序执行完毕这段内存就无法释放了,原来的指针也无法找到他了。如果是两个指针指向同一个内存,通过其中一个指针将其释放,那另一个指针就已经不知道指向那里了,不会再原位置了啊

论坛徽章:
0
36 [报告]
发表于 2008-08-06 20:46 |只看该作者
首先提出一个我的观点:free()并不是对系统的命令,而只是告知。它告诉系统:这块空间,本进程已经不再需要,你可以回收了。
那系统看见了这个告知,会怎么做呢?一个最愚蠢的系统会立即回收它。但是,这样做,系统会很忙碌,光做垃圾回收,就会让系统忙得要命。
一个完整的系统,都包含一个垃圾回收机制。其中的核心,就是一些垃圾回收算法。当需要回收时(可用空间不足时)才回收,显然在效率上要比立即回收高。

论坛徽章:
0
37 [报告]
发表于 2008-08-07 21:05 |只看该作者
free没有返回值,无法判断。刚才看了下手册,手册里面也没说free会出错!!也就是说肯定是释放成功了。

论坛徽章:
0
38 [报告]
发表于 2008-08-07 22:05 |只看该作者
内存有没有释放,要问操作系统三,苯,这个都不知道

论坛徽章:
0
39 [报告]
发表于 2008-08-07 22:18 |只看该作者
一般int   *P=new   int(1);   
  delete   P;   
  P=NULL;   
   
   
  if(P==NULL)//released

论坛徽章:
0
40 [报告]
发表于 2008-08-08 14:27 |只看该作者
按照标准写法,在free一个指针后要把这个指针的值置为NULL.在使用时先判断指针是否为空
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP