我尝试在这个简单的代码中使用 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 的版本问题。