Я попытался использовать 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;
}
}
Но он не мог оставаться в пределах памяти:
$ НКУ -O0 gc.c -lgc -o дс
$ 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
Обновление: я только что скомпилировал версию trunk от https://github.com/ivmai/bdwgc и он выглядит правильно. Так что ошибка только в 7.2d или в версии, упакованной в Ubuntu.
Обновление: libgc 7.2f, скомпилированный из источника, также работает правильно. Так что это только проблема версии Ubuntu и Debian.
@leppie, 'last' делает доступным только последний выделенный элемент, и ничто не может быть доступно из последнего выделенного элемента. – chill
@chill: Мой плохой тогда, p – leppie
размер кучи GC установлен в 100 миллионов. вероятно, больше, чем доступная память. Примечание. Введенный код не может передать выделенную память GC_free(). цикл «навсегда» для цикла сохраняет выделение памяти до тех пор, пока память не будет исчерпана. И.Е. логика программы должна быть изменена, чтобы не выделять все больше и больше памяти. эта строка: 'last = nuo;' нормально, когда последний == NULL, после этого он повреждает связанный список – user3629249