【发布时间】:2014-09-24 00:56:02
【问题描述】:
我正在用 C 语言构建一个简单的垃圾收集器,带有一个 void 指针链表,用于收集分配的指针并在最后释放它们。
#include "linked_list.h"
#define MAKE_GC(NAME) \
MAKE_LIST(NAME); \
static void _throw_away_##NAME() { \
ITERATOR(NAME) = &NAME; \
do { \
free(ITERATOR(NAME)->elem); \
} while ((ITERATOR(NAME) = ITERATOR(NAME)->next) != NULL); \
DESTROY_LIST(NAME); \
}
#define GC_ALLOC(TYPE, TARGET, LEN, GC_NAME) \
do { \
TARGET = (TYPE *)malloc(LEN * sizeof(TYPE)); \
PUSH(TYPE *, TARGET, GC_NAME); \
} while (0)
#define GC_FREE(NAME) _throw_away_##NAME()
上面是垃圾回收器,下面是linked_list.h
struct linked_list {
void *elem;
struct linked_list *next;
};
#define ITERATOR(LIST_NAME) _iter_##LIST_NAME
#define MAKE_LIST(NAME) \
struct linked_list NAME = { NULL, NULL }; \
struct linked_list *ITERATOR(NAME) = &NAME
#define PUSH(TYPE, X, LIST) \
do { \
ITERATOR(LIST) = ITERATOR(LIST)->next = (struct linked_list *)malloc(sizeof(struct linked_list)); \
*(TYPE *)ITERATOR(LIST)->elem = X; \
ITERATOR(LIST)->next = NULL; \
} while (0)
#define DESTROY_LIST(LIST) \
do { \
struct linked_list *l; \
ITERATOR(LIST) = &LIST; \
do { \
l = ITERATOR(LIST)->next; \
free(ITERATOR(LIST)); \
} while ((ITERATOR(LIST) = l) != NULL); \
} while (0)
当我使用以下代码测试此代码时,
#include <stdio.h>
#include "garbage_collector.h"
MAKE_GC(char_gc);
int main() {
char *str;
int i;
GC_ALLOC(char, str, 11, char_gc);
for (i = 0; i < 10; i++) {
putchar(str[i] = i + '0');
}
str[i] = '\0';
putchar('\n');
puts(str);
GC_FREE(char_gc);
return 0;
}
它按预期运行,尽管调试器(gdb 和 Visual Studio 调试器)不断在 GC_ALLOC 中抛出段错误。这是一段非常短的代码,我很生气,我仍然不知道哪里出错了。
我想确定我的程序在哪里出现问题并在其他地方实施之前修复它。提前感谢您的帮助。
【问题讨论】:
-
你在哪里包含
stdlib.h?你为什么要转换malloc的返回值? -
stdlib.h 应该包含在两个头文件中,这肯定不会导致问题。我使用 malloc 是因为我经常使用 c++ 编译器进行编译,尤其是 Visual Studio。
标签: c garbage-collection segmentation-fault