如何获取带接口的对象的地址?

时间:2016-06-17 11:18:01

标签: d

这与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个字节。这不可能是正确的。如何从界面获取正确的地址?

1 个答案:

答案 0 :(得分:1)

来自https://dlang.org/spec/abi.html#classes

  

将类对象转换为接口包括将接口的相应vptr的偏移量添加到对象基址的地址。将接口ptr转换回它来自的类类型涉及获取正确的偏移量以从对象中减去它。在vtbl [0]处的接口条目。

我不知道为什么这是必要的,但它似乎解释了不同的地址。