From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,4f0b59438ce4c5b9 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-10-26 01:05:40 PST Path: archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsfeed.vmunix.org!feed.news.nacamar.de!newsfeed.freenet.de!fr.ip.ndsoftware.net!proxad.net!feeder2-1.proxad.net!news1-2.free.fr!not-for-mail From: "Patrice Freydiere" Subject: Re: Deallocation & Tagged Types Date: Sun, 26 Oct 2003 09:11:05 +0100 User-Agent: Pan/0.13.0 (The whole remains beautiful) Message-ID: Newsgroups: comp.lang.ada References: <5Fhkb.3195$KA5.27417@newsfep4-glfd.server.ntli.net> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Organization: Guest of ProXad - France NNTP-Posting-Date: 26 Oct 2003 09:05:39 MET NNTP-Posting-Host: 62.147.48.189 X-Trace: 1067155539 news1-2.free.fr 261 62.147.48.189:32803 X-Complaints-To: abuse@proxad.net Xref: archiver1.google.com comp.lang.ada:1691 Date: 2003-10-26T09:05:39+01:00 List-Id: i had the same problem , i solve the issue using the "access" keyword in the destroying procedure. you can use access keyword to dispatch class wide type on the corresponding object. use this prototype on the class base definition : procedure Destroy(V: access Vehicule) is abstract and for each sub objects procedure Destroy(P : access Proxy) is begin ... -- Proxy specific desallocation operations end; hope this help Patrice On Sat, 18 Oct 2003 21:53:02 +0100, chris wrote: > 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