comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: Allocators and exceptions
Date: Mon, 10 Sep 2007 08:44:08 -0700
Date: 2007-09-10T08:44:08-07:00	[thread overview]
Message-ID: <1189439048.467517.186160@19g2000hsx.googlegroups.com> (raw)
In-Reply-To: <1189323618.588340.87180@o80g2000hse.googlegroups.com>

On Sep 9, 12:40 am, Maciej Sobczak <see.my.homep...@gmail.com> wrote:
> What happens when during the initialization of the newly allocated
> object an exception is raised?
>
> I cannot find anything in the AARM that covers this case. What I want
> to find exactly is the *guarantee* that the allocated memory is
> automatically reclaimed.
> Any relevant paragraph numbers are highly welcome.

I don't think this can be guaranteed, not as I read 4.8(10).  The
semantics of an allocator without an initializer is that the object is
created (that's the allocation), and then the components are
initialized.  If an exception raise occurs during the initialization
process, the object creation has already occurred, and there's nothing
that says that this is reversed.  In fact, I believe there is nowhere
in the language that says that memory is automatically reclaimed in
*any* situation; and, in fact, there is no guarantee that you can even
reclaim any storage at all.  13.11.2 defines Unchecked_Deallocation,
but this section has an "Implementation Advice" that says "For a
standard storage pool, Free [an instance of Unchecked_Deallocation]
should actually reclaim the storage."  Note that that is only
*advice*.  So an implementation can legitimately be an Ada compiler
without implementing Unchecked_Deallocation at all.  The message here,
I think, is that the Ada language has said that it doesn't worry about
storage reclamation; you have to worry about that yourself.

Anyway, if this is an issue, I'd write a function to perform the "new"
operation.  Using your later example:

   function new_T (Init : Integer) return T_Access is
   begin
      declare
         New_Rec : T (Init);
      begin
         return new T' (New_Rec);
      end;
   exception
      when others => ...
   end new_T;

Now any exceptions involved in initializing the record will get caught
before allocation takes place.  The allocator itself won't raise any
exceptions (other than Storage_Error), unless copying New_Rec to the
newly allocated object raises an exception, which could happen only if
there are controlled types involved and an Adjust routine raises an
exception, in which case you're in a whole bunch of trouble anyway.

                    -- Adam






  parent reply	other threads:[~2007-09-10 15:44 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-09  7:40 Allocators and exceptions Maciej Sobczak
2007-09-09 12:17 ` anon
2007-09-09 20:31   ` Maciej Sobczak
2007-09-09 22:43     ` Simon Wright
2007-09-10 12:10       ` Maciej Sobczak
2007-09-10 19:08         ` Simon Wright
2007-09-10  2:56     ` anon
2007-09-10 12:42     ` Dmitry A. Kazakov
2007-09-10 21:48       ` Maciej Sobczak
2007-09-11  9:16         ` Dmitry A. Kazakov
2007-09-11  9:19           ` Maciej Sobczak
2007-09-11 12:27             ` Dmitry A. Kazakov
2007-09-11 19:07               ` Maciej Sobczak
2007-09-11 22:56                 ` Georg Bauhaus
2007-09-12 12:36                   ` Maciej Sobczak
2007-09-12 22:19                     ` Randy Brukardt
2007-09-12  9:32                 ` Dmitry A. Kazakov
2007-09-12 12:42                   ` Maciej Sobczak
2007-09-12 15:25                     ` Dmitry A. Kazakov
2007-09-12 12:29             ` Stephen Leake
2007-09-12 12:46               ` Maciej Sobczak
2007-09-12 20:53                 ` Simon Wright
2007-09-12 22:32                   ` Randy Brukardt
2007-09-12 23:43                     ` Simon Wright
2007-09-13  3:42                       ` Randy Brukardt
2007-09-13  3:36                     ` Randy Brukardt
2007-09-13  9:43                     ` Maciej Sobczak
2007-09-12 22:25                 ` Randy Brukardt
2007-09-13 11:51                 ` Stephen Leake
2007-09-12 14:14               ` Markus E L
2007-09-10 10:37 ` Allocators and exceptions => Read Me First anon
2007-09-10 12:16   ` Maciej Sobczak
2007-09-10 22:10     ` Allocators and exceptions => Trying Again anon
2007-09-10 23:15       ` Markus E L
2007-09-10 15:44 ` Adam Beneschan [this message]
2007-09-10 21:58   ` Allocators and exceptions Maciej Sobczak
2007-09-10 22:07   ` Jeffrey R. Carter
2007-09-11  9:14   ` Dmitry A. Kazakov
2007-09-11  9:23     ` Maciej Sobczak
2007-09-11  2:36 ` Randy Brukardt
2007-09-11 15:33   ` Adam Beneschan
2007-09-11 19:21     ` Maciej Sobczak
2007-09-11 21:56     ` Adam Beneschan
2007-09-12  0:34       ` Jeffrey R. Carter
2007-09-12 12:13         ` Maciej Sobczak
2007-09-12 16:34           ` Jeffrey R. Carter
2007-09-12 23:50             ` Jeffrey R. Carter
2007-09-12 12:22       ` Maciej Sobczak
2007-09-12 14:11         ` Markus E L
2007-09-12 16:08         ` Adam Beneschan
2007-09-12 20:35           ` Dmitry A. Kazakov
2007-09-12 21:01             ` Adam Beneschan
2007-09-12 22:45             ` Randy Brukardt
2007-09-13  7:48               ` Dmitry A. Kazakov
2007-09-12  3:08 ` Allocators and exceptions -- Debugging says memory leak! anon
replies disabled

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