On Wednesday, 1 September 2021 at 18:20:59 UTC, Paul Backus wrote:
>On Monday, 30 August 2021 at 16:12:57 UTC, Adam D Ruppe wrote:
>On Monday, 30 August 2021 at 16:03:29 UTC, Guillaume Piolat wrote:
>Hyped by ProtoObject, this is our hope for a nothrow @nogc .destroy eventually!
This fails today only because of the rt_finalize hook working through void*. If you cut that out...
class Foo {
~this() @nogc nothrow {}
}
void main() @nogc nothrow {
scope auto foo = new Foo();
foo.__xdtor();
}
this works today.
I thought the problem with this was that destructors aren't virtual, so if you write something like this:
[...]
...then you end up calling Foo's destructor, but not Bar's. That's why rt_finalize uses TypeInfo to look up the destructor for the object's runtime type.
we can use custom destructors:
class Foo {
~this() nothrow @nogc {}
void destroy() nothrow @nogc
{
__xdtor();
}
}
class Bar : Foo {
override void destroy()
{
super.destroy();
}
}
void main() {
Foo foo = new Bar();
foo.destroy();
}
I dont know why destructors are not virtual. This makes sense for constructors as the correct instance size is required but not for destructors.