Справочник по Ada 2005
13.11.2 Освобождение неконтролируемой памяти
Освобождение неконтролируемой памяти объекта, обозначенного значением типа доступа, достигается вызовом экземпляра обобщённой процедуры Unchecked_Deallocation.
Статическая семантика
Существует следующая определяемая языком обобщённая библиотечная процедура:
generic
type Object(<>) is limited private;
type Name is access Object;
procedure Ada.Unchecked_Deallocation(X : in out Name);
pragma Convention(Intrinsic, Ada.Unchecked_Deallocation);
pragma Preelaborate(Ada.Unchecked_Deallocation);
type Object(<>) is limited private;
type Name is access Object;
procedure Ada.Unchecked_Deallocation(X : in out Name);
pragma Convention(Intrinsic, Ada.Unchecked_Deallocation);
pragma Preelaborate(Ada.Unchecked_Deallocation);
Динамическая семантика
Предположим, что экземпляр Unchecked_Deallocation объявлен следующим образом:
procedure Free is
new Ada.Unchecked_Deallocation(
object_subtype_name, access_to_variable_subtype_name);
new Ada.Unchecked_Deallocation(
object_subtype_name, access_to_variable_subtype_name);
Процедура Free имеет следующий эффект:
1.
После выполнения Free(X), значение X становится null.
2.
Free(X), когда X уже равно null, не оказывает никакого эффекта.
3.
Free(X), когда X не равно null, сначала выполняет завершение объекта, на который указывает X (и любые его корасширения — см. 3.10.2), как описано в 7.6.1. Затем она освобождает память, занимаемую объектом, на который указывает X (и любыми его корасширениями). Если пул памяти является пользовательским объектом, то память освобождается путём вызова Deallocate, передавая access_to_variable_subtype_name'Storage_Pool в качестве параметра Pool. Storage_Address — значение, возвращённое в параметре Storage_Address соответствующего вызова Allocate. Size_In_Storage_Elements и Alignment — те же значения, что и при соответствующем вызове Allocate. Существует одно исключение: если освобождаемый объект содержит задачи, объект может не быть освобождён.
После Free(X), объект, на который указывает X, и все его подкомпоненты (и корасширения) больше не существуют; их память может быть повторно использована для других целей.
Ограниченные (времени выполнения) ошибки
Освобождение дискриминированного, незавершенного объекта задачи является ограниченной ошибкой. Возможные последствия:
- Исключение не генерируется.
- Программа или ошибка управления задачами генерируется в момент освобождения.
- Программа или ошибка управления задачами генерируется в задаче при её следующем обращении к дискриминантам.
В первых двух случаях память для дискриминантов (и для любого содержащего объекта, если он обозначен дискриминантом доступа к задаче) не возвращается перед завершением задачи.
Ошибочное выполнение
Оценивание имени, обозначающего несуществующий объект, является ошибкой. Выполнение вызова экземпляра Unchecked_Deallocation является ошибкой, если объект был создан не через аллокатор для типа доступа, пул которого — Name'Storage_Pool.
Рекомендации по реализации
Для стандартного пула памяти Free должна фактически возвращать используемую память.
ПРИМЕЧАНИЯ
27 Правила, относящиеся к Free, применяются к любому экземпляру Unchecked_Deallocation.
28 Unchecked_Deallocation нельзя создавать для типов доступа к константе. Это подразумевается правилами 12.5.4.