What is going on here?

Shachar Shemesh via Digitalmars-d digitalmars-d at puremagic.com
Wed Mar 4 21:54:14 PST 2015


On 05/03/15 04:09, deadalnix wrote:
> On Wednesday, 4 March 2015 at 19:36:20 UTC, Ali Çehreli wrote:
>> Even C++ gets this right.
>>
>> Ali
>
> Nop, I do think C++ destroy uninitialized fields.

I'm sorry, but you are wrong.

In C++, a destructor is run for "fully constructed" objects. Fully 
constructed is defined to be an object whose constructor has finished 
successfully (i.e. - without throwing).

Construction order of an object is:
1. Parent(s), if any, in no particular order (unless employing virtual 
inheritance, in which case a virtual grandparent is constructed before 
its descendants)
2. Members, in the order in which they were defined in the class (not 
the order in which they are listed in the constructor. gcc gives a 
warning if the two are not the same)
3. The actual object

This means that all members are parents are fully constructed by the 
time the constructor body starts to run, which means that if it throws, 
the class itself is the only one for which a destructor isn't going to 
get called.

This also has the less desirable effect that if you want to call a 
member's non-default constructor, you need to have all arguments ready 
before the class' constructor starts to run.

Personally, I think the first is well worth the occasional case where 
the second becomes a liability.

Shachar


More information about the Digitalmars-d mailing list