On Sunday, 24 September 2017 at 19:52:52 UTC, bitwise wrote:
On Sunday, 24 September 2017 at 17:11:26 UTC, Haridas wrote:
In the following code, Bar is an element of struct Foo. Is there a way to avoid a call to ~Bar when ~Foo is getting executed?


Don't construct it to begin with.

struct Bar {
    import std.stdio : writeln;
    int a = 123;
    void boink() { writeln(a); }
    ~this(){ writeln("bar dtor"); }
}

struct Foo
{
    ubyte[Bar.sizeof] barBuffer;
    Bar* _bar = null;

    ref Bar bar()
    {
        import std.conv : emplace;

        if(!_bar) {
            _bar = cast(Bar*)barBuffer.ptr;
            emplace(_bar);
        }

        return *_bar;
    }
}

You shouldn't store the pointer to barBuffer inside Foo. The language allows moving the structure around with a simple memcpy, so _bar is likely to point into garbage soon after it's assigned. Why don't you just return *cast(Bar*)barBuffer.ptr in bar()? You could still emplace a Bar inside barBuffer in Foo's constructor, if needed.



Reply via email to