Update page '1.2. Работа с памятью'

Gregory Lirent 2022-08-17 10:20:23 +03:00
parent 92f2d1a895
commit 71107a1852

@ -1,4 +1,22 @@
## Работа с памятью
При добавлении значения в контейнер (не важно, число это или любой другой контейнер), управление памятью полученного ресурса делегируется родительскому контейнеру. Поэтому при высвобождении ресурсов родительского контейнера, будут высвобождены все дочерние ресурсы, нет необходимости делать это вручную.
Тем не менее, следует помнить, что при добавлении контейнера, в качестве значения, в другой контейнер - создается его глубокая копия. Высвобождение ресурсов копируемого контейнера все еще должно быть осуществлено пользователем.
Для этого, каждому контейнеру соответсвует символ (все они перечислены в [include/vtype.h](https://gogs.lirent.ru/lirent/libcdsb/src/master/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](https://gogs.lirent.ru/lirent/libcdsb/src/master/include/extra/memory.h) и [include/extra/cstring.h](https://gogs.lirent.ru/lirent/libcdsb/src/master/include/extra/cstring.h)