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

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

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

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

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

Правила допустимости

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

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

Предположим, что экземпляр Unchecked_Deallocation объявлен следующим образом:
procedure Free is
new Ada.Unchecked_Deallocation(
object_subtype_name, access_to_variable_subtype_name);
Процедура Free выполняет следующие действия:
1.
После выполнения Free(X), значение X становится null.
2.
Если X уже равно null, Free(X) не оказывает никакого влияния.
3.
Если X не равно null, Free(X) сначала выполняет финализацию объекта, на который указывает 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 указан как ноль или определён языком как ноль.
ПРИМЕЧАНИЯ
30 Правила, относящиеся к Free, применяются ко всем экземплярам Unchecked_Deallocation.
31 Unchecked_Deallocation нельзя инстанциировать для типа доступа к константе. Это подразумевается правилами 12.5.4.


Spec-Zone.ru

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