RCArray is unsafe

Zach the Mystic via Digitalmars-d digitalmars-d at puremagic.com
Sun Mar 1 08:54:14 PST 2015


On Sunday, 1 March 2015 at 15:44:49 UTC, Marc Schütz wrote:
> Walter posted an example implementation of a reference counted 
> array [1], that utilizes the features introduced in DIP25 [2]. 
> Then, in the threads about reference counted objects, several 
> people posted examples [3, 4] that broke the suggested 
> optimization of eliding `opAddRef()`/`opRelease()` calls in 
> certain situations.
>
> A weakness of the same kind affects DIP25, too. The core of the 
> problem is borrowing (ref return as in DIP25), combined with 
> manual (albeit hidden) memory management. An example to 
> illustrate:
>
>     struct T {
>         void doSomething();
>     }
>     struct S {
>         RCArray!T array;
>     }
>     void main() {
>         auto s = S(RCArray!T([T()])); // s.array's refcount is 
> now 1
>         foo(s, s.array[0]);           // pass by ref
>     }
>     void foo(ref S s, ref T T) {
>         s.array = RCArray!T([]);      // drop the old s.array
>         t.doSomething();              // oops, t is gone
>     }
>
> Any suggestions how to deal with this? As far as I can see, 
> there are the following options:

See:
http://forum.dlang.org/post/bghjqvvrdcfqmoiyyuqz@forum.dlang.org
...and:
http://forum.dlang.org/post/cviwlkugnothraubcfgy@forum.dlang.org


More information about the Digitalmars-d mailing list