Re: Exception unwinding base destructor called - why?
From: John Harrison (john_andronicus_at_hotmail.com)
Date: 06/24/04
- Next message: John Harrison: "Re: How to create an N dimensional array with N elements?"
- Previous message: John Harrison: "Re: convert a double keeping msb ?"
- In reply to: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Next in thread: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Reply: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Thu, 24 Jun 2004 18:25:12 +0100
"Douglas Peterson" <Tergiver@nospam.msn.com> wrote in message
news:P92dndYQSsjubUfdRVn-jw@comcast.com...
> Thanks to Andre, John, and David for taking the time to reply.
>
> After your explanations and giving it more thought, I accept that a fully
> constucted object needs to be deconstructed. Makes perfect sense when you
> look at it outside of the problem your having :)
>
> Here's what the issue was and how I'm going to change it:
>
> The objects in my system are all contained in lists. There is a root item
> with a list of objects, those objects contain a list of objects and so on,
> and so on.
>
> I wanted two properties for objects that are contained in this system:
>
> 1) Objects could be created externally so that they can be further derived
> by the user. That is to say you don't call Container.CreateObject() to
> create one, you can 'new Object'.
> 2) Objects would automagically be added and removed to/from the containers
> they belong to.
>
> To accomplish #2, the constructors of the object's deepest base class were
> adding and removing themselves to their owner's lists. When an exception
> occurs during object construction, one of two possibilities occurs
depending
> on what point the exception is thrown:
>
> 1) The object has been added to the container's list, but doesn't (can't)
> remove itself when its not getting fully constructed. This leads to an
> attempt by the container to delete an already deleted object.
> 2) The object isn't yet added, but its destructor tries to unlist itself.
>
> Number 1 can be solved by placing the 'insert myself into my owner's
> container' line of code dead last in the constructor. That way if an
> exception occurs during its construction, its not added. If the exception
> occurs in a derived class, we get number 2 because the base is fully
> constructed and will be destructed.
> Number 2 is benign, however, my container list code asserts because in
most
> cases the programmer wants to know that his code is trying to remove
> something that isn't there (a potential bug).
>
> So I'm left with a choice:
>
> 1) Remove the automagic and require all objects to be inserted after they
> are constructed.
> 2) Remove the assertion from my list class to allow for benign attempts at
> removal.
>
> I'll elicit some respones before making a descision.
>
I don't understand the problem, its seems to me that C++'s rules are helping
you, but you seem to think that they hinder you.
Here's how I see it, the deepest base class ctor adds to the list, the
deepest base class removes from the list. Nothing else happens in the
deepest base class ctor and dtor.
So when an object is constructed the first thing to happen is that the
deepest base class ctor is called. If it constructs successfully then the
object is on a list and the deepest base class dtor will remove it from that
list should an exception be thrown later during construction. If by chance
an exception happens while adding to the list, then the object isn't in the
list but the dtor won't be called because the deepest base class wasn't
fully constructed. Isn't that exactly what you want?
Seems straightforward to me, maybe you could make the problem clearer with
some sample code.
john
- Next message: John Harrison: "Re: How to create an N dimensional array with N elements?"
- Previous message: John Harrison: "Re: convert a double keeping msb ?"
- In reply to: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Next in thread: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Reply: Douglas Peterson: "Re: Exception unwinding base destructor called - why?"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|