GC for noobs
Adam D. Ruppe
destructionator at gmail.com
Thu Feb 27 08:10:32 PST 2014
On Thursday, 27 February 2014 at 14:37:14 UTC, Szymon Gatner
wrote:
> They actually don't have all the necessary features in D afaiu.
> They do have value semantics but can't represent uniqueness
> because of missing move d-tor.
struct MovingStruct {
@disable this(this);
typeof(this) release() {
auto p = this.payload;
this.payload = null;
return typeof(this)(p);
}
}
That does moving via an explicit release call which is statically
forced upon you by the disabled copy.
MovingStruct s = some_payload;
// MovingStruct s2 = s; // compile error
MovingStruct s2 = s.release;
assert(s.payload is null); // passes
assert(s2.payload is some_payload); // we good
You can also easily do structs with reference semantics:
struct RefStruct {
private struct Impl {
// implementation here
}
Impl* payload;
alias payload this;
}
RefStruct is now just a thin wrapper over a pointer and thus
inherits the pointer's semantics.
You can add a destructor to RefStruct to free it
deterministically with RAII as well. To avoid double free, you
can use the move technique or refcounting:
struct RefCountingStruct {
private struct Impl {
// implementation here
int refcount;
}
Impl* payload;
alias payload this;
@disable this(); // disable default constructor to force
factory
static RefCountingStruct create() {
RefCountingStruct t = void;
t.payload = new Impl();
t.payload.refcount = 1;
return t;
}
this(this) { if(payload !is null) payload.refcount++; }
~this() {
if(payload !is null) {
payload.refcount--;
if(payload.refcount == 0)
whatever_free(payload);
}
}
}
i wish my book was out but it is still only half done... but i
wrote a chapter with like eight different struct tricks like
this. structs rock.
More information about the Digitalmars-d-learn
mailing list