From 71107a1852da42dd0970fa8db247887d714894d9 Mon Sep 17 00:00:00 2001 From: Gregory Lirent Date: Wed, 17 Aug 2022 10:20:23 +0300 Subject: [PATCH] =?UTF-8?q?Update=20page=20'1.2.=20=D0=A0=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=20=D1=81=20=D0=BF=D0=B0=D0=BC=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=D1=8E'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.2. Работа с памятью.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/1.2. Работа с памятью.md b/1.2. Работа с памятью.md index 7de3f74..49290ae 100644 --- a/1.2. Работа с памятью.md +++ b/1.2. Работа с памятью.md @@ -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)