Spec-Zone.ru › Ada 2005
Справочник по 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);

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

Предположим, что экземпляр 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, передавая 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.


Spec-Zone.ru

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