In order to use unchecked_deallocation you must instantiate the library package on your access type. Here is a small example: -- test_u_d.adb test unchecked_deallocation with Text_IO; use Text_IO; with Unchecked_Deallocation; procedure Test_U_D is type Node; type Link is access Node; type Node is record I : Integer; -- could be anything you want F : Float; -- in a node of a linked list Next : Link; -- link to next in list end record; Head : Link; -- Ada makes this initially null; P : Link; -- variable for use in while statement procedure Free is new Unchecked_Deallocation(Node, Link); -- usage is Free(X); where X is of type Link package Int_IO is new Integer_IO(Integer); use Int_IO; package Flt_IO is new Float_IO(Float); use Flt_IO; begin Head := new Node'(1, 1.0, null); -- now one item in list Head.Next := new Node'(2, 2.0, null); -- second item Head.Next.Next := new Node'(3,3.0, null); -- third item -- Print out list to verify it exists P := Head; while P /= null loop Put(P.I); Put(", "); Put(P.F); Put_Line(" initial"); P := P.Next; end loop; -- now link the first item to the third item and free the second P := Head.Next; -- P points to second item Put(P.I); Put(", "); Put(P.F); Put_Line(" P is second"); Head.Next := P.Next; -- now, the first item is linked to third item Free(P); -- Finally! use Unchecked_Deallocation to free space -- Print out list to verify it has 1 and 3 P := Head; while P /= null loop Put(P.I); Put(", "); Put(P.F); Put_Line(" final"); P := P.Next; end loop; -- 1, 1.00000E+00 initial -- 2, 2.00000E+00 initial end Test_U_D; -- 3, 3.00000E+00 initial -- 2, 2.00000E+00 P is second -- 1, 1.00000E+00 final -- 3, 3.00000E+00 final