DIP74: Reference Counted Class Objects
H. S. Teoh via Digitalmars-d
digitalmars-d at puremagic.com
Fri Feb 27 07:42:41 PST 2015
On Thu, Feb 26, 2015 at 11:35:55PM -0800, Walter Bright via Digitalmars-d wrote:
> On 2/26/2015 5:37 PM, H. S. Teoh via Digitalmars-d wrote:
> >Wait, are you saying that forgetting the 'return' annotation will
> >still compile without any warning?? Wow, that's ... not nice. :-(
>
> Indeed, and the compiler will error out if you try that:
>
> ---
> struct S {
> int x;
> }
>
> ref int foo(ref S s) {
> return s.x;
> }
> ---
>
> dmd -c foo -dip25
> foo.d(7): Error: escaping reference to local ref variable s
>
> There'd be no point to DIP25 if it didn't.
Huh? We weren't talking about that -- it's already a given that this
case works, otherwise DIP25 would truly have no point.
The problematic case comes from the manually-managed array member that
you can freely return, yet it may become a dangling reference once
opRelease deallocates it:
class S {
int[] data;
int[] foo() { return data; } // <-- happily compiles
void opAddRef() { ... }
void opRelease() {
...
GC.free(data); // <-- uh oh
}
}
int[] fun() {
S s = /* create instance of S */
return s.foo();
// s goes out of scope here, and opRelease() cleans up
// but we now have an escaping reference to s.data
}
void main() {
int[] dangling = fun();
dangling[0] = 1; // kaboom
}
S.foo() should have been annotated with 'return', but the programmer
forgot and the compiler still accepts the code without any warnings,
thereby violating @safe.
T
--
Bomb technician: If I'm running, try to keep up.
More information about the Digitalmars-d
mailing list