免费注册 查看新帖 |

Chinaunix

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

给c实现一个垃圾回收器有多大难度? [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-24 00:06 |只看该作者 |倒序浏览
大家说说看, 我对计算机组成原理了解不多, c是编译运行的, 我想这个难度应该相当大吧.

我不懂, 大家说说看.

当然我不是指能自动回收malloc分配出去的内存, 对于编译执行的语言这个几乎无法实现. 能不能定义自己的malloc, 使得内存在不被使用时能够自动回收.

论坛徽章:
0
2 [报告]
发表于 2007-06-24 00:18 |只看该作者
当然不是了,编译执行的也可以实现的
一个最简单的办法就是
当malloc不能再分配的时候,执行下面两遍扫描:
第一遍扫描程序中所有的指针,看看他们指向堆中的那些部分,并记录下来
第二遍扫描堆,将那些没有被指针指向的内存释放掉

原帖由 koolcoy 于 2007-6-24 00:06 发表
大家说说看, 我对计算机组成原理了解不多, c是编译运行的, 我想这个难度应该相当大吧.

我不懂, 大家说说看.

当然我不是指能自动回收malloc分配出去的内存, 对于编译执行的语言这个几乎无法实现. 能不能定义 ...

论坛徽章:
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
3 [报告]
发表于 2007-06-24 00:25 |只看该作者
原帖由 koolcoy 于 2007-6-24 00:06 发表
大家说说看, 我对计算机组成原理了解不多, c是编译运行的, 我想这个难度应该相当大吧.

我不懂, 大家说说看.

当然我不是指能自动回收malloc分配出去的内存, 对于编译执行的语言这个几乎无法实现. 能不能定义 ...

建议楼主搜些垃圾回收方面的资料先看看。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2007-06-24 08:22 |只看该作者
原帖由 ypxing 于 2007-6-24 00:18 发表
当然不是了,编译执行的也可以实现的
一个最简单的办法就是
当malloc不能再分配的时候,执行下面两遍扫描:
第一遍扫描程序中所有的指针,看看他们指向堆中的那些部分,并记录下来
第二遍扫描堆,将那些没有被 ...

我看事情远不是这么简单的, 在c中你可以把整数转换成指针, 指针也就是整数, 也就是说你根本就不知道哪些是指针哪些是整数. 所以你不可能把所有的指针都扫描一遍.

我认为这个问题才是c中垃圾回收最大的问题, 除非你自己定义一种新的指针的表示方式, 至于回收算法什么的一搜一大把.

[ 本帖最后由 koolcoy 于 2007-6-24 08:33 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-06-24 08:50 |只看该作者
你可以对所有的指针变量进行追踪

“把整数转换成指针, 指针也就是整数”

即使允许你“整数转换成指针",这种不是malloc生成的地址,你还要管吗?

原帖由 koolcoy 于 2007-6-24 08:22 发表

我看事情远不是这么简单的, 在c中你可以把整数转换成指针, 指针也就是整数, 也就是说你根本就不知道哪些是指针哪些是整数. 所以你不可能把所有的指针都扫描一遍.

我认为这个问题才是c中垃圾回收最大的问题,  ...

[ 本帖最后由 ypxing 于 2007-6-24 21:03 编辑 ]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2007-06-24 16:12 |只看该作者
原帖由 ypxing 于 2007-6-24 08:50 发表
建议你好好想想
你可以对所有的指针变量进行追踪

“把整数转换成指针, 指针也就是整数”

即使允许你“整数转换成指针",这种不是malloc生成的地址,你还要管吗?


当然要管了:

  1. char* p;
  2. p = malloc(1);
  3. int i = (int)p;
  4. int b = i;
  5. int* c = (int*)b;
复制代码

上面代码中的c你管还是不管? 如果要管的话你怎么去追踪它? b该不该管呢? 如果后面还有一个return b; 又该怎么管呢?

[ 本帖最后由 koolcoy 于 2007-6-24 16:20 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-06-24 16:21 |只看该作者
原帖由 koolcoy 于 2007-6-24 16:12 发表

当然要管了:

  1. char* p;
  2. p = malloc(1);
  3. int i = (int)p;
  4. int b = i;
  5. int* c = (int*)b;
复制代码

上面代码中的c你管还是不管? 如果要管的话你怎么去追踪它?


”第一遍扫描程序中所有的指针,看看他们指向堆中的那些部分,并记录下来“
这样c就会被记录下来,发现它是指向堆中的一块内存的,那么这块内存不能释放

并不需要追踪这些指针的传递过程
哪些是指针类型(比如你说的c)的你总知道吧,呵呵

[ 本帖最后由 ypxing 于 2007-6-24 21:03 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2007-06-24 18:25 |只看该作者
给点提示,实现很简单

#include <stdlib.h>

#ifndef NDEBUG
#define malloc  f_automem_malloc
#define free     f_automem_free
#endif

struct s_memblock {
    struct s_memblock *prev, *next;
};

struct s_memblock *v_memblocks;

static int v_initial = 0;

static void f_automem_exit(void) {
    /* check v_memblocks for leak memblock */
    /* free them and send warning message */
}

static void f_automem_init(void) {
    if (!v_initial) {
         atexit(f_automem_exit);
         v_initial = 1;
    }
}

void *f_automem_malloc(size_t size) {
     f_automem_init();
    /* allocate a new memblock */
   /* and link it to the link table */
}

void f_automem_free(void *memblock) {
    /* unlink the memblock from link table */
    /* free the memblock */
}

论坛徽章:
0
9 [报告]
发表于 2007-06-24 19:24 |只看该作者
原帖由 ypxing 于 2007-6-24 16:21 发表


都给你说了
”第一遍扫描程序中所有的指针,看看他们指向堆中的那些部分,并记录下来“
这样c就会被记录下来,发现它是指向堆中的一块内存的,那么这块内存不能释放

并不需要追踪这些指针的传递过程
哪 ...

还有个疑问

  1. long int a;
  2. void* ap;

  3. ap = malloc(1);
  4. a = (long int)ap;
  5. ap = malloc(1);
复制代码

这种情况怎么处理?

论坛徽章:
0
10 [报告]
发表于 2007-06-24 19:35 |只看该作者
原帖由 mingyanguo 于 2007-6-24 19:24 发表

还有个疑问

  1. long int a;
  2. void* ap;

  3. ap = malloc(1);
  4. a = (long int)ap;
  5. ap = malloc(1);
复制代码

这种情况怎么处理?


假设第一次malloc的内存为A,第二次malloc的内存为B
经过第一遍扫描,发现有一个指针ap指向内存B,但是没有指针指向内存A(通过a你是无法访问A的)
第二遍扫描堆的时候,将A释放,B保留
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP