TDPL: Manual invocation of destructor
bearophile
bearophileHUGS at lycos.com
Tue Aug 10 05:43:48 PDT 2010
Steven Schveighoffer:
> The thing is, even with clear, the above code is undefined -- a cleared
> object is in no state to be used. But the difference between delete and
> clear is -- delete ensures the reference you delete will cause an
> immediate error on use, but does nothing to prevent memory corruption to
> all the other references to the same memory. Clear does the same for the
> reference you clear, but also prevents memory corruption for all the other
> references to the same memory. So even though you are in undefined
> territory, the runtime makes a best effort to avoid you cutting off your
> head. The error may still be silent, but it's not deadly.
If in nonrelease mode clear() sets a zombi-mode bit inside the object, the language can then add asserts that stop the program if a zombi object is used (field accessors too need such assert, it's an object invariant).
To reduce the runtime overhead of all those asserts you can do something like C# does with the IDisposable, the language may allow to call clear() only on objects tagged with something like @clearable, so all other objects don't need those asserts.
This is a fully runtime situation and I don't like it a lot. But it's not so different from what C# does.
> It might even be a good idea to zero out the vtable to cause a loud error
> on the next dynamic cast or virtual function call :)
OK.
Bye,
bearophile
More information about the Digitalmars-d
mailing list