> -- Алексей Елин писал(а):
> Если остаются экземпляры типов, то нелзя выгружать и глобальные переменные модуля, и тем более код. Иначе через экземпляр в любой момент можно вызвать выгруженный код а он может обратиться к выгруженной переменной, уже занятым другими данными.Так что меня сомнения берут, что модуль можно выгрузить при наличии экземпляров его типов. К тому же защититься от этого достаточно просто: надо считать количество созданий/освобождений экземпляров любого типа модуля (как динамически, так и на стеке).Глобальные переменные не "выгружаются" в смысле уничтожения, просто теряется на них ссылка, и они соберутся сборщиком мусора как обычно (если остались другие ссылки, то не соберутся).

Проблема обращения к коду, который выгружен, известна. Она касается только методов объектов, и процедур, присвоенных в процедурные переменные. Считается, что выгрузка модуля - это вообще операция, производимая, как правило, только при разработке, когда нужно последовательно попробовать несколько версий одного и того же модуля. В промышленном использовании это очень редко имеет смысл, и требует соответствующего планирования и соблюдения предосторожностей.

Насколько я знаю, выгруженный код не может обратиться к выгруженной переменной, так как выгруженный блок памяти помечается как неисполняемый и, соответственно, ОС выбросит исключение при попытке передать туда управление.

Не думаю, что имеет смысл считать число экземпляров для всех типов, тем более что записи могут размещаться на стеке. Я думаю, что вполне реализуемо вот что: при сборке мусора можно ставить флажок во всех дескрипторах, для которых нашёлся хотя бы один экземпляр объекта. Если модуль выгружен, и в его дескрипторах не установился ни один флажок, весь блок дескрипторов можно выгрузить.