我建立一個簡單的垃圾收集器C,與收集malloced指針,並釋放他們都在最後一個空指針鏈表。段錯誤在C垃圾收集
#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'的返回值? – 2014-09-24 01:49:15
stdlib.h應該包含在兩個頭文件中,並且不會造成問題。我投了malloc,因爲我經常使用C++編譯器進行編譯,特別是Visual Studio。 – xiver77 2014-09-24 02:00:39