What is going on here?
Steven Schveighoffer via Digitalmars-d
digitalmars-d at puremagic.com
Fri Mar 6 21:09:31 PST 2015
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);
> 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?
More information about the Digitalmars-d