The following code does not invoke S.~this. If I change `struct S` to `class S` - it does. Memory consumption remains constant, meaning memory is collected, but destructors are not called.

import std.stdio;
import std.conv;

struct S {
    string s;

    ~this() {
        writeln("~S");
    }
}

void main() {
    auto i = 0;
    S[] arr;

    while (true) {
        arr ~= S("hello " ~ text(i++));
        if (arr.length == 1_000_000) {
            writeln(&arr[8888], " = ", arr[8888].s);
            arr.length = 0;
        }
    }
}


Is it a bug? How can I effectively implement RAII with this behavior?

The situation is, I allocate resources for my users and return them a handle. I can't control what my users do with this handle, they might as well append it to a dynamic array/insert to AA, and remove it eventually. Also, the handle might be shared between several logical components, so it's not that one of them can explicitly finalize it.

Any workaround for this? Perhaps disallow certain types be allocated by the GC (I would actually want this feature very much)?


-tomer

Reply via email to