Destructor order

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 22 11:03:59 PDT 2014


On 10/22/2014 08:45 AM, eles wrote:> C++ versions:
 >
 >      { //displays ~C~B~A
 >          A foo;
 >          B bar;
 >          C *caz = new C();
 >          delete caz;
 >      }
 >
 >      std::cout << std::endl;
 >
 >      { //displays ~C~B~A
 >          std::unique_ptr<A> foo = std::make_unique<A>();
 >          std::unique_ptr<B> bar = std::make_unique<B>();
 >          C *caz = new C();
 >          delete caz;
 >      }
 >
 >
 > D version:
 >
 >      { //displays ~A~B~C
 >          A foo = scoped!(A)();
 >          B bar = scoped!(B)();
 >          C caz = new C();
 >          destroy(caz);
 >      }
 >
 > Why the objects are not destroyed in the inverse order of their
 > creation? Case in point, destroying foo releases a lock for bar and caz.

I confirm this. If you put writeln() expressions inside typecons.scoped, 
you will realize that the destroys are happening right after each scoped 
line:

constructed A
destroying
~A
constructed B
destroying
~B
~C

Extremely dangerous and very tricky! The solution? Define the objects as 
'auto' (or 'const', etc.), which you want anyway:

     auto foo = scoped!(A)();
     auto bar = scoped!(B)();

You do not want to be left with A or B. You want Scoped!A and Scoped!B.

Ali



More information about the Digitalmars-d-learn mailing list