13.11.2 Unchecked Storage Deallocation
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.
The following language-defined
generic library procedure exists:
Object(<>) is limited private
Name is access
Ada.Unchecked_Deallocation(X : in out
Given an instance of
Unchecked_Deallocation declared as follows:
procedure Free is
Procedure Free has the
After executing Free(X), the value of X is null.
Free(X), when X is already equal to null, has no effect.
Free(X), when X is not equal to null
first performs finalization
of the object designated by X (and any coextensions of the object —
), as described in 7.6.1
It then deallocates the storage occupied by the object designated by
X (and any coextensions). If the storage pool is a user-defined object,
then the storage is deallocated by calling Deallocate, passing access_to_variable_subtype_name
as the Pool parameter. Storage_Address is the value returned in the Storage_Address
parameter of the corresponding Allocate call. Size_In_Storage_Elements
and Alignment are the same values passed to the corresponding Allocate
call. There is one exception: if the object being freed contains tasks,
the object might not be deallocated.
Free(X), the object designated by X, and any subcomponents (and coextensions)
thereof, no longer exist; their storage can be reused for other purposes.
Bounded (Run-Time) Errors
is a bounded error to free a discriminated, unterminated task object.
The possible consequences are:
or Tasking_Error is raised at the point of the deallocation.
or Tasking_Error is raised in the task the next time it references any
of the discriminants.
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.
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.
For a standard storage pool, Free should actually
reclaim the storage.
27 The rules here that refer to Free apply
to any instance of Unchecked_Deallocation.
28 Unchecked_Deallocation cannot be instantiated
for an access-to-constant type. This is implied by the rules of 12.5.4