On 3/4/15 2:31 PM, Shachar Shemesh wrote:
On 04/03/15 17:43, Steven Schveighoffer wrote:
On 3/4/15 8:43 AM, Shachar Shemesh wrote:
I'd expect A's destructor to run, which does not seem to be the case.
I believe destructors are not run when you throw inside a constructor.
So plan to deallocate if the ctor throws:
a = A(var + 1);
scope(failure) destroy(a);
-Steve
That's pretty horrible. So now I need to keep track of the
implementation of my members to figure out whether it is okay to skip
the destructor or not.
Why does it matter? If the member is constructed, insert a
scope(failure) destroy, otherwise don't. Or don't throw in the ctor and
mark it nothrow, then you don't have to worry about it at all.
All of this from a language that claims to support RAII, which was
invented precisely so the programmer does not have to keep track of
those things.
It would be nice if there is a way. D, unlike C++, does not separate
construction of members from the code. This means the situation is not
as easy to solve.
But an interesting question -- when constructing a struct or class,
isn't every member initialized with it's init value anyway? Why would
calling dtor on that be bad?
-Steve