#c #garbage-collection #boehm-gc
#c #сборка мусора #boehm-gc
Вопрос:
Согласно руководству, GC_MALLOC
очищает память, но GC_MALLOC_ATOMIC
не очищает память.
void * GC_MALLOC(size_t nbytes)
Allocates and *clears* nbytes of storage.
void * GC_MALLOC_ATOMIC(size_t nbytes)
Allocates nbytes of storage.
https://www.hboehm.info/gc/gcinterface.html
Так GC_MALLOC_ATOMIC
следует использовать для замены malloc
и GC_MALLOC
следует использовать для замены calloc
? Это так?
Ответ №1:
Так
GC_MALLOC_ATOMIC
следует использовать для заменыmalloc
иGC_MALLOC
следует использовать для заменыcalloc
? Это так?
Нет.
Вы правы, что GC_MALLOC_ATOMIC()
похоже malloc()
на то, что malloc()
не гарантирует очистки выделенного пространства, тогда как GC_MALLOC()
похоже calloc()
на то, что оно действительно очищает выделенное пространство, но в самом общем смысле вы должны заменить оба malloc()
и calloc()
на GC_MALLOC()
. Это потому, что,
GC_MALLOC_ATOMIC()
документирует это ограничение:
Клиент обещает, что результирующий объект никогда не будет содержать никаких указателей.
- Объекты, которые действительно содержат указатели, должны быть очищены при выделении, чтобы GC мог быть уверен в своей интерпретации этих объектов при сканировании их на предмет указателей.
С другой стороны, обычно есть некоторые знания об использовании выделяемого пространства, и когда это происходит, GC_MALLOC_ATOMIC()
предпочтительнее для объектов, которые не содержат указателей. Это потому, что GC не будет (никогда) тратить время на сканирование результирующих объектов на предмет указателей. Если вы хотите, чтобы результаты были заполнены нулем, то сделайте это вручную, позже. memset()
является распространенным средством для этого.