DIP74: Reference Counted Class Objects
Andrei Alexandrescu via Digitalmars-d
digitalmars-d at puremagic.com
Thu Feb 26 18:05:31 PST 2015
On 2/26/15 5:43 PM, Andrei Alexandrescu wrote:
> The compiler will issue errors if returning ref to direct members. There
> won't be errors with returning ref to owned indirect members that the
> class deallocates manually. -- Andrei
To clarify this point, which I think is important, consider:
class Widget {
private int x;
private int[] a;
...
ref int getX() { return x; }
int[] getA() { return a; }
}
This is all fine and dandy - people can take and keep a reference to x
in a GC object, and of course can get keep the array (or a portion of
it) etc.
Now say we port Widget to an RC system:
class Widget {
private int x;
private int[] a;
...
ref int getX() { return x; }
int[] getA() { return a; }
void opAddRef();
void opRelease();
}
Not getX() does NOT compile anymore, whereas getA() CONTINUES to
compile. To make getX() compile, the user must change code to:
ref int getX() return { return x; }
That makes the compiler go, "oh ok I'll make sure the reference doesn't
outlive the current object". And all is again fine and dandy.
Now if the person defining Widget wants to own (and release
deterministically) the array, they must make sure their use of memory is
scoped appropriately, e.g. by using RCSlice.
Andrei
More information about the Digitalmars-d
mailing list