Table of Contents
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Работа с памятью
При добавлении значения в контейнер (не важно, число это или любой другой контейнер), управление памятью полученного ресурса делегируется родительскому контейнеру. Поэтому при высвобождении ресурсов родительского контейнера, будут высвобождены все дочерние ресурсы, нет необходимости делать это вручную.
Тем не менее, следует помнить, что при добавлении контейнера, в качестве значения, в другой контейнер - создается его глубокая копия. Высвобождение ресурсов копируемого контейнера все еще должно быть осуществлено пользователем.
Для этого, каждому контейнеру соответсвует символ (все они перечислены в include/vtype.h):
void string_free(vtype_string* x)
void array_free(vtype_array* x)
void list_free(vtype_list* x)
void map_free(vtype_map* x)
void vset_free(vtype_set* x)
void dict_free(vtype_dict* x)
Ресурсы контейнеров должны высвобождаться только с помощью данных методов, так как только в этом случае гарантируется полное высвобождение всех используемых ресурсов и исключается вероятность утечки памяти.
Контейнер не может быть валидным до тех пор, пока не произведена его инициализация (посредством копирования другого контейнера или при помощи базовой инициализации, которая описывается в разделах, соответсвующих конкретным контейнерам).
Тонкости реализации
Управление памятью в проекте осуществляется исключительно при помощи функций описанных в include/extra/memory.h и include/extra/cstring.h (также см. 2.7. Дополнительно).
Вот их полный список:
void* libcdsb_aalloc(size_t a, size_t n)
void* libcdsb_malloc(size_t n)
void* libcdsb_calloc(size_t n, size_t c)
void* libcdsb_realloc(void *p, size_t n)
char* libcdsb_strdup(const char* s)
char* libcdsb_strndup(const char* s, size_t n)
void* libcdsb_memndup(const void* m, size_t n)
высвобождение памяти осуществляется вызовом
void libcdsb_free(void* s)
В случае необходимости изменения принципов работы с памятью, данные символы могут быть подменены пользовательским решением: гарантированно, что иные символы не будут использованы для выделения памяти внутри проекта.
Отдельным пунктом, можно обозначить служебную структуру stack_t, а также методы для работы с ней:
void libcdsb_stack_init(stack_t* stack)
void libcdsb_stack_push(stack_t* stack, void* value)
void libcdsb_stack_push_many(stack_t* stack, size_t n, ...)
void* libcdsb_stack_pop(stack_t* stack)
void libcdsb_stack_flush(stack_t* stack)
Выделение памяти для этой структуры носит исключительный характер, так как void libcdsb_stack_push(stack_t* stack, void* value)
и void libcdsb_stack_push_many(stack_t* stack, size_t n, ...)
используют вызов void* malloc (size_t n)
. Высвобождение памяти в void* libcdsb_stack_pop(stack_t* stack)
и void libcdsb_stack_flush(stack_t* stack)
осуществляется вызовом void free(void* s)
.