我尝试在此简单代码中使用libgc(BDW垃圾收集器)。
请注意,该引用仅保留到伪造“列表”中的最后一个节点,因此,活动集仅是最后两个节点。
// thanks to @chill for this example
#include <gc.h>
struct list {
struct list* next;
};
int main() {
GC_INIT();
struct list *last = NULL;
for (;;) {
struct list* nuo = GC_MALLOC(sizeof(struct list));
nuo->next = NULL;
// if next line is commented, then no leakage
if (last) last->next = nuo;
last = nuo;
}
}
但是它不能保持在内存限制内:
$ gcc -O0 gc.c -lgc -o gc
$ GC_MAXIMUM_HEAP_SIZE = 100000000 ./gc
GC Warning: Out of Memory! Trying to continue ...
GC Warning: Out of Memory! Trying to continue ...
GC Warning: Out of Memory! Trying to continue ...
GC Warning: Out of Memory! Trying to continue ...
GC Warning: Out of Memory! Heap size: 95 MiB. Returning NULL!
Segmentation fault
我做错了什么?
Ubuntu 15.04 x86_64 gcc 4.9.2 libgc 7.2d-6.4
更新:我刚刚从https://github.com/ivmai/bdwgc编译了主干版本,它看起来可以正常工作。因此,该错误仅出现在7.2d或Ubuntu打包的版本中。
更新:从源编译的libgc 7.2f也可以正常工作。因此,这只是Ubuntu和Debian的版本问题。
最佳答案
它可能只是一个错误,但也可能是错误指针的受害者。 BDWGC是保守的GC;如果单词“看起来像”指针恰好指向GC_m分配的内存,则将保留该内存。如果某个错误指针碰巧指向您的列表节点之一,它将被意外保留,并且指向该节点的所有节点也将保留。
关于弱GC健壮性进行了讨论。有关详细信息,请参见以下论文:
http://www.hpl.hp.com/techreports/2001/HPL-2001-251.pdf
常见的习惯用法是在节点未使用时手动使下一个链接无效。