Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

13.11.2 Освобождение памяти без проверок

Освобождение памяти объекта, обозначенного значением типа доступа, достигается вызовом экземпляра обобщенной процедуры Unchecked_Deallocation.

Статическая семантика

Существует следующая определяемая языком обобщенная библиотечная процедура:
generic
type Object(<>) is limited private;
type Name is access Object;
procedure Ada.Unchecked_Deallocation(X : in out Name)
with Preelaborate, Nonblocking,
Global => in out Name'Storage_Pool,
Convention => Intrinsic;

Правила законности

Вызов экземпляра Unchecked_Deallocation является незаконным, если фактический тип доступа экземпляра — это тип, для которого Storage_Size был указан статической выражением со значением ноль или определён языком как ноль. В дополнение к местам, где обычно применяются правила законности (см. 12.3), это правило применяется также в частях типа "private" экземпляра обобщенного блока.

Динамическая семантика

Предположим, что экземпляр Unchecked_Deallocation объявлен следующим образом:
procedure Free is
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, как описано в 13.11. Есть одно исключение: если освобождаемый объект содержит задачи, то не определено, будет ли объект освобожден.
После этапа завершения Free(X) объект, на который указывает X, и все его подкомпоненты (и корасширения), больше не существуют; их память может быть повторно использована для других целей.

Ограниченные (временно́й) ошибки

Освобождение дискриминированного, незавершенного объекта задачи является ограниченной ошибкой. Возможные последствия:
  • Исключение не генерируется.
  • Program_Error или Tasking_Error генерируется в момент освобождения памяти.
  • Program_Error или Tasking_Error генерируется в задаче при следующем обращении к каким-либо дискриминантам.
В первых двух случаях память для дискриминантов (и для любого содержащего объекта, если он обозначен дискриминантом доступа к задаче) не возвращается до завершения задачи.
Значение доступа, которое указывает на несуществующий объект, называется висячей ссылкой.
Если висячая ссылка разыменовывается (неявно или явно), выполнение становится ошибочным (см. ниже). Если явного или неявного разыменования нет, то оценка выражения, результатом которого является висячая ссылка, является ограниченной ошибкой. Если ошибка обнаружена, то генерируется либо Constraint_Error, либо Program_Error. В противном случае выполнение продолжается нормально, но с возможностью того, что значение доступа указывает на какой-либо другой существующий объект.

Ошибочное выполнение

Оценивание имени, обозначающего несуществующий объект, или защищенной подпрограммы или переименования подпрограммы, связанный объект (если таковой имеется) которого несуществует, является ошибочным. Выполнение вызова экземпляра Unchecked_Deallocation является ошибочным, если объект был создан не посредством аллокатора для типа доступа, чьим пулом является Name'Storage_Pool.

Рекомендации по реализации

Для стандартного пула памяти Free должно фактически возвращать освобождённую память.
Вызов экземпляра Unchecked_Deallocation с ненулевым значением доступа должен генерировать Program_Error, если фактический тип доступа экземпляра — это тип, для которого Storage_Size был задан как ноль или определён языком как ноль.
ПРИМЕЧАНИЕ 1 Правила, относящиеся к Free, здесь применяются ко всем экземплярам Unchecked_Deallocation.
ПРИМЕЧАНИЕ 2 Unchecked_Deallocation не может быть инстанцирован для типа доступа к константе. Это подразумевается правилами 12.5.4.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API