Справочник по Ada 95
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, сначала выполняет финализацию, как описано в 7.6. Затем она деаллоцирует память, занимаемую объектом, на который указывает X. Если пул памяти является пользовательским объектом, то память деаллоцируется путем вызова Deallocate, передавая access_to_variable_subtype_name'Storage_Pool в качестве параметра Pool. Storage_Address — это значение, возвращаемое в параметре Storage_Address соответствующего вызова Allocate. Size_In_Storage_Elements и Alignment имеют те же значения, что и при соответствующем вызове Allocate. Есть одно исключение: если освобождаемый объект содержит задачи, объект может не быть деаллоцирован.
После Free(X), объект, на который указывает X, и все его подкомпоненты, больше не существуют; их память может быть повторно использована для других целей.
Ограниченные (времени выполнения) ошибки
Ошибка при освобождении дискриминированного, неостановленного объекта задачи является ограниченной ошибкой. Возможные последствия:
- Исключение не генерируется.
- Program_Error или Tasking_Error генерируются в момент деаллокации.
- Program_Error или Tasking_Error генерируются в задаче при следующем обращении к какому-либо из дискриминантов.
В первых двух случаях память для дискриминантов (и для любого включающего объекта, если он обозначен дискриминантом доступа задачи) не возвращается перед завершением задачи.
Ошибка выполнения
Оценка имени, обозначающего несуществующий объект, является ошибкой. Выполнение вызова экземпляра Unchecked_Deallocation является ошибочным, если объект был создан не с помощью аллокатора для типа доступа, чей пул — Name'Storage_Pool.
Рекомендации по реализации
Для стандартного пула памяти Free должно фактически возвращать память.
ПРИМЕЧАНИЯ
26 Правила, относящиеся к Free, применяются ко всем экземплярам Unchecked_Deallocation.
27 Unchecked_Deallocation не может быть инстанцирован для типа доступа к константе. Это подразумевается правилами 12.5.4.