这与Disposing a class with an interface?
有关interface Bar{
}
class Foo: Bar{
int i;
this(int _i){
i = _i;
}
}
void main(){
import std.experimental.allocator.mallocator;
import std.experimental.allocator;
auto f = Mallocator.instance.make!Foo(42);
Bar b = f;
void* p = (cast(void*)b);
void* p1 = (cast(void*)f);
writeln(p);
writeln(p1);
Mallocator.instance.dispose(b);// Bad
}
打印:
1EBE438
1EBE420
因此Bar
的地址偏移量为24个字节。这不可能是正确的。如何从界面获取正确的地址?
答案 0 :(得分:1)
来自https://dlang.org/spec/abi.html#classes:
将类对象转换为接口包括将接口的相应vptr的偏移量添加到对象基址的地址。将接口ptr转换回它来自的类类型涉及获取正确的偏移量以从对象中减去它。在vtbl [0]处的接口条目。
我不知道为什么这是必要的,但它似乎解释了不同的地址。