> -- Galkov писал(а):
> Хм... А как производится   ...А без понимания - огромный дискомфорт имеет место быть
В реализации возможны вариации, а суть в следующем:

язык устроен так, что компилятор при компиляции имеет полную информацию -- и потому может как-то ее зафиксировать для использования во время исполнения -- о структуре ссылок, которая будет иметь место при выполнении:

известно, где будут указатели
в блоках глобальных переменных каждого модуля
в блоках локальных переменных каждой активации каждой процедуры
в каждом блоке памяти (запись или массив) на куче.

Поэтому в любой нужный момент (внутри вызова NEW) можно организовать обход всех данных по указателям, стартуя с глобальных переменных модулей (список модулей системе доступен в любой момент) и активаций процедур (тоже).

Грубо говоря, сначала соотв. процедура обходит данные и как-то отмечает (битиком) те блоки, до которых она добралась (это используемая память).
Потом собирает (скажем, в список свободных модулей) все остальные блоки (это "мусор", до которого ни одна процедура ни одного модуля уже не может добраться).
Потом разотмечает занятые блоки.

Указанный тут порядок (сначал...потом...) -- смысловой.
Реально возможны варианты (типа сбор в список свободных и разотмечание занятых за один сплошной проход по памяти -- "sweep").
Как возможны варианты реализации разметки.

Но детали не важны.
А важно (суть) то, что у компилятора есть вся необходимая информация благодаря строгой типизации, распространенной на указатели.