comp.lang.ada
 help / color / mirror / Atom feed
* Deallocation & Tagged Types
@ 2003-10-18 20:53 chris
  2003-10-19 15:38 ` Robert I. Eachus
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: chris @ 2003-10-18 20:53 UTC (permalink / raw)


Hi,

I've got a situation involving deallocating an object from a proxy and 
am a bit stuck...  Namely how to deallocate an object belonging to a 
particular class but not knowing the specific type.

The example is not from the code, it just highlights the problem...


-- a vehicles package
--
package Vehicles is

    type Vehicle is abstract tagged null record;
    type Vehicle_Access is access all Vehicle'class;

    procedure Destroy (V : in out Vehicle) is abstract;

end Vehicles;

-- proxies for vehicles
--
package Vehicle_Proxy is

    type Proxy is new Vehicle with private;

    procedure Destroy (V : in out Proxy);

private
    type Proxy is new Vehicle with record
       Actual : Vehicle_Access;
    end record;

end Vehicle_Proxy;

package body Vehicle_Proxy is

    procedure Destroy (V : in out Proxy) is
    begin
       Destroy (V.Actual.all);

       -- now what???
    end Destroy;

end Vehicle_Proxy;



If V.Actual isn't properly disposed of, the proxy will leak.  What's the 
best way to handle this?  One way I can think of is to do something like 
this...

type Vehicle_Deallocator
    is access procedure (V : in out Vehicle_Access);

and revise type Proxy to the following,

    type Proxy is new Vehicle with record
       Actual  : Vehicle_Access;
       Dealloc : Vehicle_Deallocator;
    end record;

and Destroy to

    procedure Destroy (V : in out Proxy) is
    begin
       Destroy (V.Actual.all);
       V.Dealloc (V.Actual);
       V.Actual := null;
    end Destroy;


Is there another way that I'm missing or is this how people do this in 
their code?  I also came up against this when making a container type (a 
container for rasters in the real code).  Namely if you stuff 
Raster_Access into a container (an Image) and destroy the Image 
container, you need to deallocate the rasters.  That means you need to 
have a deallocator capable of handling the types derived from Raster. 
If you miss one, the code breaks.

The alternative is to deallocate each raster outside of the image 
container, but you still need someway of handling each subclass of raster.



Cheers,
Chris




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2003-10-26  8:11 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-10-18 20:53 Deallocation & Tagged Types chris
2003-10-19 15:38 ` Robert I. Eachus
2003-10-19 16:53   ` chris
2003-10-20  1:08     ` Robert I. Eachus
2003-10-19 16:10 ` Dmitry A. Kazakov
2003-10-19 16:50   ` chris
2003-10-20  1:13     ` Robert I. Eachus
2003-10-20  1:43       ` Hyman Rosen
2003-10-26  8:11 ` Patrice Freydiere

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox