RCArray is unsafe

via Digitalmars-d digitalmars-d at puremagic.com
Sun Mar 1 09:48:13 PST 2015


On Sunday, 1 March 2015 at 16:54:15 UTC, Zach the Mystic wrote:
> 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

That's not applicable here though. The compiler doesn't know 
we're doing reference counting, so it cannot insert 
AddRef/Release calls.


More information about the Digitalmars-d mailing list