1
Unchecked storage deallocation of an object designated by a value of an access type is achieved by a call to an instance of the generic procedure Unchecked_Deallocation.
2
The following language−defined generic library procedure exists:
3
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);
4
Given an instance of Unchecked_Deallocation declared as follows:
5
procedure Free is new Ada.Unchecked_Deallocation( object_subtype_name, access_to_variable_subtype_name);
6
Procedure Free has the following effect:
7
8
9/2
10/2
After Free(X), the object designated by X, and any subcomponents (and coextensions) thereof, no longer exist; their storage can be reused for other purposes.
11
It is a bounded error to free a discriminated, unterminated task object. The possible consequences are:
12
13
14
15
In the first two cases, the storage for the discriminants (and for any enclosing object if it is designated by an access discriminant of the task) is not reclaimed prior to task termination.
16
Evaluating a name that denotes a nonexistent object is erroneous. The execution of a call to an instance of Unchecked_Deallocation is erroneous if the object was created other than by an allocator for an access type whose pool is Name'Storage_Pool.
17
For a standard storage pool, Free should actually reclaim the storage.
NOTES
18
27 The rules here that refer to Free apply to any instance of Unchecked_Deallocation.
19
28 Unchecked_Deallocation cannot be instantiated for an access−to−constant type. This is implied by the rules of 12.5.4.