On Saturday, 25 February 2017 at 15:13:27 UTC, Radu wrote:

Here is sample on how destroy fails with a fwd decl error:

struct A
{
    B b;
    C c;
}

struct B
{
    Wrap!A val;
}

struct C
{
    Wrap!A val;
}

struct Wrap(T)
{

    this(bool b)
    {
        t = cast(T*) malloc(T.sizeof);
    }

    ~this()
    {
destroy(*t); // Error: struct app.A no size because of forward reference
    }
    T* t;
}

Thanks for the example.


Manual management fails now with the current construct, inst't it?

Hm, that's an issue you'd best take up to the bugtracker, I think. Maybe there's a way around that, but I don't know.


auto a = cast (A*) malloc(A.sizeof); // Allocate
emplace(a, 42);                      // Construct

destroy(a);                          // Destruct
|-- here a becomes null
assert(a is null); // :}
free(a);                             // Deallocate
|- free null...

You need to save a into a temp, then call free on temp.

A nice to have enhancement would be to return the destroyed pointer from destroy, enabling something like:

destroy(a).free();

Well, yes, but that is still backwards-incompatible and breaking user code is something I was under the impression was a big NO currently.

Reply via email to