我試過在這個簡單的代碼中使用libgc(BDW垃圾回收器)。libgc:爲什麼這個代碼泄漏?
請注意,該參考僅保留在假「列表」中的最後一個節點,因此,活動集僅爲最後兩個節點。
// 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 =億./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編譯中繼版本,它看起來工作正常。所以,bug只在7.2d或者打包到Ubuntu的版本中。
Update:libgc 7.2f compilled from source also works properly。所以這只是Ubuntu和Debian的版本問題。
@leppie,'last'只讓最後一個分配的元素可到達,並且沒有任何東西可以從最後分配的元素到達。 – chill
@chill:我的不好; p – leppie
GC堆大小設置爲1億。可能比可用內存更多。注意:發佈的代碼無法將分配的內存傳遞給GC_free()。 '永遠'''循環不斷分配內存,直到內存耗盡。 I.E.程序邏輯需要被修改,以避免分配越來越多的內存。這一行:'last = nuo'是ok,當last == NULL時,在調用GC_MALLOC()後,它破壞鏈表 – user3629249