On 14.10.2015 14:57, Szymon Gatner wrote:
extern(C++)
void freeSubtract(Operation animal) {
   auto cat = cast(Subtract) animal; <<====== cast yields null
   if(cat !is null) {
     destroy(cat);
     free(cast(void*) cat);
   }
}

extern(C++)
void useOperation(Operation t) {
   auto res = t.execute(1, 2);
}

Everything works fine except the marked line. Subtract instance seems to
be created correctly on D side as it returns valid result in the
execute() call on C++ side but then when trying to free the instance on
D side again, downcast from Operation to Subtract fails resulting in null.


To get compatible class layout, the D compiler has to omit it's class info entry in the vtable of C++ classes. In addition D doesn't know about C++ RTTI (I don't know if this is planned to add), so it cannot do the dynamic cast from Operation to Subtract.

I have not tried, but calling the virtual destructor instead of destroy() might just work?

Reply via email to