From: Simon Wright <simon@pushface.org>
Subject: Re: Strings with discriminated records
Date: Mon, 28 May 2018 08:42:21 +0100
Date: 2018-05-28T08:42:21+01:00 [thread overview]
Message-ID: <lyvab8i5uq.fsf@pushface.org> (raw)
In-Reply-To: 090d6eb2-9f52-4471-a22e-ce1bdf457188@googlegroups.com
NiGHTS <nights@unku.us> writes:
> I confirmed with an Ada.Text_IO.Put_Line() that Finalize was called
> three times. I then disabled Finalize and created an explicitly called
> Finalize2 function and it worked fine. It's weird though because my
> program only elaborated the object once, so why did it finalize three
> times?
You need to read ARM7.6, in particular (17):
http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-7-6.html#p17
Disregarding for the moment any "assignment" that might happen in
computing the result of Create, & looking at
declare
M : Nights.Message := Nights.Create ("Hello World");
begin
null;
end;
First, the Create call makes an anonymous object.
Then, M is in theory finalized, but this is likely optimised away.
Then, the bits of the anonymous object are copied into M. This is a
"shallow copy". [***]
Then, the anonymous object is finalized, which frees
<anonymous>.Cstr. HOWEVER, M.Cstr still contains the same value, which
means it's pointing to deallocated memory.
Then, on exit from the declare block, M is finalized, and Finalize tries
to free M.Cstr again. Oops.
This is always going to happen if you make a shallow copy of something
which contains plain allocated memory.
As Dmitry said upthread, you need an Adjust, which makes a deep copy of
the plain allocated memory, immediately after [***] above:
procedure Adjust (M : in out Message) is
use Interfaces.C.Strings;
begin
M.Cstr := New_Char_Array (Value (M.Cstr));
end Adjust;
> I tried wrapping the body of finalize in a condition to force it to
> run only once, yet it still managed to run it again ignoring the
> boolean.
If the boolean was in Message, the same argument as above applies.
> I'm perplexed. Not sure if I should ever trust
> Ada.Finalization.Controlled.
As with most things, not until you know how to use it.
next prev parent reply other threads:[~2018-05-28 7:42 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-26 21:43 Strings with discriminated records NiGHTS
2018-05-26 23:42 ` Shark8
2018-05-27 1:42 ` NiGHTS
2018-05-27 8:39 ` Dmitry A. Kazakov
2018-05-27 12:22 ` Mehdi Saada
2018-05-27 12:40 ` Dmitry A. Kazakov
2018-05-27 14:34 ` NiGHTS
2018-05-27 14:50 ` Dmitry A. Kazakov
2018-05-27 15:19 ` NiGHTS
2018-05-27 15:32 ` AdaMagica
2018-05-27 16:22 ` NiGHTS
2018-05-29 22:31 ` Randy Brukardt
2018-05-30 7:29 ` Dmitry A. Kazakov
2018-05-30 20:11 ` Randy Brukardt
2018-05-27 12:48 ` Mehdi Saada
2018-05-27 13:03 ` Dmitry A. Kazakov
2018-05-27 17:11 ` NiGHTS
2018-05-27 18:07 ` Simon Wright
2018-05-27 23:08 ` NiGHTS
2018-05-28 1:44 ` Jere
2018-05-28 3:05 ` NiGHTS
2018-05-28 3:23 ` NiGHTS
2018-05-27 18:25 ` Dmitry A. Kazakov
2018-05-27 22:44 ` NiGHTS
2018-05-28 7:29 ` Dmitry A. Kazakov
2018-05-28 7:42 ` Simon Wright [this message]
2018-05-28 18:38 ` Shark8
2018-05-28 21:15 ` Mehdi Saada
2018-05-28 21:48 ` Shark8
2018-05-28 22:27 ` Mehdi Saada
2018-05-28 23:59 ` Shark8
2018-05-29 0:41 ` Dan'l Miller
2018-05-30 17:11 ` Shark8
2018-05-29 7:49 ` Dmitry A. Kazakov
2018-05-29 9:31 ` AdaMagica
2018-05-29 10:14 ` Dmitry A. Kazakov
2018-05-29 13:40 ` Dan'l Miller
2018-05-29 14:04 ` Dmitry A. Kazakov
2018-05-29 22:41 ` Randy Brukardt
2018-05-30 5:00 ` J-P. Rosen
2018-05-30 20:09 ` Randy Brukardt
2018-05-31 4:19 ` J-P. Rosen
2018-05-31 22:18 ` Randy Brukardt
2018-06-01 13:35 ` Dan'l Miller
2018-06-01 15:20 ` Dmitry A. Kazakov
2018-05-28 13:55 ` NiGHTS
2018-05-29 14:37 ` Mehdi Saada
2018-05-29 22:44 ` Randy Brukardt
2018-05-29 22:41 ` Mehdi Saada
2018-05-30 19:46 ` Randy Brukardt
2018-05-30 19:48 ` Randy Brukardt
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox