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.