Summary: gc finalization/freeing is hierarchy agnostic
           Product: D
           Version: D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P3
         Component: druntime

--- Comment #0 from 2011-09-13 17:58:47 PDT ---
class A
    ~this() {}
    void cleanup() {}

class B
    this(A a) { this.a = a; }
    ~this() { a.cleanup(); }
    A a;

void main() {
    auto a = new A();
    auto b = new B(a);
    // allocating a at a lower address than b causes it to be finalized earlier
    assert(cast(void*)b.a < cast(void*)b);

Finalization is done in memory order and does not take
hierarchies into account.
When b.a is finalized before b it's vtable is set to null, hence
a segfault will happen when accessing the vtable.
Anyhow a is destroyed before b even though it is referenced by b.

It seems like we need to somehow sort the to be finalized memory while
Any cheap ideas to do that are welcome.

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to