Freeing pointers to classwide types is done in the same way as freeing any pointer to a type, using Ada.Unchecked_Deallocation.
with Ada.Unchecked_Deallocation;
procedure testfree is
   type Object is tagged
      record
         Test : Integer;
      end record;
   type Object2 is new Object with
      record
         More_Stuff : Integer;
      end record;
   type Pointer is access all Object'Class;
   procedure Free_Object is new
      Ada.Unchecked_Deallocation(Object'Class, Pointer);
   -- Note the use of the classwide type Object'Class
   X : Pointer := new Object;
   Y : Pointer := new Object2;
begin
   Free_Object(X);
   Free_Object(Y);
end testfree;
 |