comp.lang.ada
 help / color / mirror / Atom feed
* Unchecked_Deallocation with tagged class type.
@ 2023-11-14 21:11 Blady
  2023-11-14 22:42 ` Dmitry A. Kazakov
  0 siblings, 1 reply; 7+ messages in thread
From: Blady @ 2023-11-14 21:11 UTC (permalink / raw)


Hello,

The following code present a Finalize procedure with a parameter of 
access tagged class type in order to deallocate the memory of the given 
parameter from the root tagged type TTA and his children.
The same for TTB which is inherited from TTA. But this Finalize call 
Finalize of TTA.
It may be not the best idea.
But let's see:

with Ada.Unchecked_Deallocation;
procedure test_20231113_free_tag is

    type TTA is tagged record
       AA : Integer;
    end record;
    type ATTA is access all TTA;
    type CATTA is access all TTA'Class;
    procedure Finalize (O : in out CATTA) is
       procedure Free is new Ada.Unchecked_Deallocation (TTA, ATTA);
    begin
       Free (ATTA (O));
    end Finalize;

    type TTB is new TTA with record
       BB : Integer;
    end record;
    type ATTB is access all TTB;
    type CATTB is access all TTB'Class;
    procedure Finalize (O : in out CATTB) is
    begin
       Finalize (CATTA (O));
    end Finalize;

    OA : CATTA := new TTA;
    OB : CATTB := new TTB;

begin
    Finalize (OA);
    Finalize (OB);
end test_20231113_free_tag;

The procedure Free is the instanciation of Unchecked_Deallocation with 
the tagged type TTA.
Thus the call "Finalize (OA);" deallocate the memory of object OA of 
type access class TTA.

But what does "Finalize (OB);"?
What is the memory deallocate of object OB of type TTB?

Thanks, Pascal.


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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-14 21:11 Unchecked_Deallocation with tagged class type Blady
@ 2023-11-14 22:42 ` Dmitry A. Kazakov
  2023-11-15 20:26   ` Blady
  0 siblings, 1 reply; 7+ messages in thread
From: Dmitry A. Kazakov @ 2023-11-14 22:42 UTC (permalink / raw)


On 2023-11-14 22:11, Blady wrote:

> The following code present a Finalize procedure with a parameter of 
> access tagged class type in order to deallocate the memory of the given 
> parameter from the root tagged type TTA and his children.
> The same for TTB which is inherited from TTA. But this Finalize call 
> Finalize of TTA.
> It may be not the best idea.
> But let's see:
> 
> with Ada.Unchecked_Deallocation;
> procedure test_20231113_free_tag is
> 
>     type TTA is tagged record
>        AA : Integer;
>     end record;
>     type ATTA is access all TTA;
>     type CATTA is access all TTA'Class;
>     procedure Finalize (O : in out CATTA) is
>        procedure Free is new Ada.Unchecked_Deallocation (TTA, ATTA);
>     begin
>        Free (ATTA (O));
>     end Finalize;
> 
>     type TTB is new TTA with record
>        BB : Integer;
>     end record;
>     type ATTB is access all TTB;
>     type CATTB is access all TTB'Class;
>     procedure Finalize (O : in out CATTB) is
>     begin
>        Finalize (CATTA (O));
>     end Finalize;
> 
>     OA : CATTA := new TTA;
>     OB : CATTB := new TTB;
> 
> begin
>     Finalize (OA);
>     Finalize (OB);
> end test_20231113_free_tag;
> 
> The procedure Free is the instanciation of Unchecked_Deallocation with 
> the tagged type TTA.
> Thus the call "Finalize (OA);" deallocate the memory of object OA of 
> type access class TTA.
> 
> But what does "Finalize (OB);"?

Crashes your program. It is a bug. You should instantiate 
Unchecked_Deallocation with class-wide type if you pass a class-wide 
pointer.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-14 22:42 ` Dmitry A. Kazakov
@ 2023-11-15 20:26   ` Blady
  2023-11-15 21:17     ` Dmitry A. Kazakov
  0 siblings, 1 reply; 7+ messages in thread
From: Blady @ 2023-11-15 20:26 UTC (permalink / raw)


Le 14/11/2023 à 23:42, Dmitry A. Kazakov a écrit :
>> But what does "Finalize (OB);"?
> 
> Crashes your program. It is a bug. You should instantiate 
> Unchecked_Deallocation with class-wide type if you pass a class-wide 
> pointer.

Thanks, I haven't considered this possibility.
Note: the previous program built with GNAT FSF 13.2.0 ran without exception.

I've changed:
with Ada.Unchecked_Deallocation;
procedure test_20231113_free_class is

    type TTA is tagged record
       AA : Integer;
    end record;
    type ATTA is access all TTA;
    type CATTA is access all TTA'Class;
    procedure Finalize (O : in out CATTA) is
       procedure Free is new Ada.Unchecked_Deallocation (TTA'Class, CATTA);
    begin
       Free (O);
    end Finalize;

    type TTB is new TTA with record
       BB : Integer;
    end record;
    type ATTB is access all TTB;
    type CATTB is access all TTB'Class;
    procedure Finalize (O : in out CATTB) is
    begin
       Finalize (CATTA (O));
    end Finalize;

    OA : CATTA := new TTA;
    OB : CATTB := new TTB;

begin
    Finalize (OA);
    Finalize (OB);
end test_20231113_free_class;

It runs without exception.
One question remains about "Finalize (OB);":
Which memory size is deallocated TTA'Size or TTB'Size?

Thanks, Pascal.



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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-15 20:26   ` Blady
@ 2023-11-15 21:17     ` Dmitry A. Kazakov
  2023-11-16 20:29       ` Blady
  0 siblings, 1 reply; 7+ messages in thread
From: Dmitry A. Kazakov @ 2023-11-15 21:17 UTC (permalink / raw)


On 2023-11-15 21:26, Blady wrote:
> Le 14/11/2023 à 23:42, Dmitry A. Kazakov a écrit :
>>> But what does "Finalize (OB);"?
>>
>> Crashes your program. It is a bug. You should instantiate 
>> Unchecked_Deallocation with class-wide type if you pass a class-wide 
>> pointer.
> 
> Thanks, I haven't considered this possibility.
> Note: the previous program built with GNAT FSF 13.2.0 ran without 
> exception.
> 
> I've changed:
> with Ada.Unchecked_Deallocation;
> procedure test_20231113_free_class is
> 
>     type TTA is tagged record
>        AA : Integer;
>     end record;
>     type ATTA is access all TTA;
>     type CATTA is access all TTA'Class;
>     procedure Finalize (O : in out CATTA) is
>        procedure Free is new Ada.Unchecked_Deallocation (TTA'Class, CATTA);
>     begin
>        Free (O);
>     end Finalize;
> 
>     type TTB is new TTA with record
>        BB : Integer;
>     end record;
>     type ATTB is access all TTB;
>     type CATTB is access all TTB'Class;
>     procedure Finalize (O : in out CATTB) is
>     begin
>        Finalize (CATTA (O));
>     end Finalize;
> 
>     OA : CATTA := new TTA;
>     OB : CATTB := new TTB;
> 
> begin
>     Finalize (OA);
>     Finalize (OB);
> end test_20231113_free_class;
> 
> It runs without exception.
> One question remains about "Finalize (OB);":
> Which memory size is deallocated TTA'Size or TTB'Size?

It is a wrong question. The implementation of the pool may ignore size 
using the block size instead. Furthermore T'Size is not necessarily the 
size actually allocated.

Regarding Unchecked_Deallocation instantiated with a pointer to a 
class-wide object, consider it dispatching on the target object tag. 
Thus you can deallocate any object using any instance of 
Unchecked_Deallocation for any class-wide parent of, interfaces included.

So Finalize (OB) is OK.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-15 21:17     ` Dmitry A. Kazakov
@ 2023-11-16 20:29       ` Blady
  2023-11-17 13:12         ` AdaMagica
  0 siblings, 1 reply; 7+ messages in thread
From: Blady @ 2023-11-16 20:29 UTC (permalink / raw)


Le 15/11/2023 à 22:17, Dmitry A. Kazakov a écrit :
> On 2023-11-15 21:26, Blady wrote:
>> Le 14/11/2023 à 23:42, Dmitry A. Kazakov a écrit :
>>>> But what does "Finalize (OB);"?
<...>
> Regarding Unchecked_Deallocation instantiated with a pointer to a 
> class-wide object, consider it dispatching on the target object tag. 
> Thus you can deallocate any object using any instance of 
> Unchecked_Deallocation for any class-wide parent of, interfaces included.
> 
> So Finalize (OB) is OK.
> 

Thanks, yes, the instanciation of Unchecked_Deallocation seemed to 
indicate that but I was not able to confirm it from the Ada RM.
A mention in Ada RM 13.11.2 Unchecked Storage Deallocation of that 
particular possibility would be valuable.

Regards, Pascal.

PS: after a quick search, I found also a smart answer with a full 
example from Simon:
https://stackoverflow.com/questions/64951954/how-can-i-do-an-unchecked-deallocation-of-abstract-classes-in-ada

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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-16 20:29       ` Blady
@ 2023-11-17 13:12         ` AdaMagica
  2023-11-17 13:13           ` AdaMagica
  0 siblings, 1 reply; 7+ messages in thread
From: AdaMagica @ 2023-11-17 13:12 UTC (permalink / raw)


Blady schrieb am Donnerstag, 16. November 2023 um 21:29:20 UTC+1:
> Thanks, yes, the instanciation of Unchecked_Deallocation seemed to
> indicate that but I was not able to confirm it from the Ada RM.
> A mention in Ada RM 13.11.2 Unchecked Storage Deallocation of that
> particular possibility would be valuable.

type Object(<>) is limited private;

The box here denotes unknown discriminants, i.e. indefinite types - these include task types;
limited is "assume the worst" => i.e. any type may be used as actual type for this formal type.

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

* Re: Unchecked_Deallocation with tagged class type.
  2023-11-17 13:12         ` AdaMagica
@ 2023-11-17 13:13           ` AdaMagica
  0 siblings, 0 replies; 7+ messages in thread
From: AdaMagica @ 2023-11-17 13:13 UTC (permalink / raw)


AdaMagica schrieb am Freitag, 17. November 2023 um 14:12:25 UTC+1:
> Blady schrieb am Donnerstag, 16. November 2023 um 21:29:20 UTC+1: 
> > Thanks, yes, the instanciation of Unchecked_Deallocation seemed to 
> > indicate that but I was not able to confirm it from the Ada RM. 
> > A mention in Ada RM 13.11.2 Unchecked Storage Deallocation of that 
> > particular possibility would be valuable.
> type Object(<>) is limited private; 
> 
> The box here denotes unknown discriminants, i.e. indefinite types - these include task types;
nonsense - I mean class types
> limited is "assume the worst" => i.e. any type may be used as actual type for this formal type.

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

end of thread, other threads:[~2023-11-17 13:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-14 21:11 Unchecked_Deallocation with tagged class type Blady
2023-11-14 22:42 ` Dmitry A. Kazakov
2023-11-15 20:26   ` Blady
2023-11-15 21:17     ` Dmitry A. Kazakov
2023-11-16 20:29       ` Blady
2023-11-17 13:12         ` AdaMagica
2023-11-17 13:13           ` AdaMagica

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