RCArray is unsafe

deadalnix via Digitalmars-d digitalmars-d at puremagic.com
Mon Mar 2 21:27:20 PST 2015


On Tuesday, 3 March 2015 at 01:56:09 UTC, Walter Bright wrote:
> On 3/2/2015 4:40 PM, deadalnix wrote:
>> After moving resources, the previous owner can no longer be 
>> used.
>
> How does that work with the example presented by Marc?

I'm not sure what you don't understand. The comment in the sample 
code seems clear to me.

// "Move" `a` into `b`
// Here's what happens under the hood: the pointer `a` gets 
copied (*not*
// the data on the heap, just its address) into `b`. Now both are 
pointers
// to the *same* heap allocated data. But now, `b` *owns* the heap
// allocated data; `b` is now in charge of freeing the memory in 
the heap.
let b = a;

Now you have a variable b that owns the data. a is not usable 
anymore.

// After the previous move, `a` can no longer be used
// Error! `a` can no longer access the data, because it no longer 
owns the
// heap memory
//println!("a contains: {}", a);
// TODO ^ Try uncommenting this line

As explained here, if a is used, this is an error.

In the example a is move to b. If you had let b = &a, then b 
would borrow from a. The same way, a would not be usable anymore. 
The difference with move is that, when b is destroyed, in the 
first case memory is freed. in the second case, memory is not 
freed and a is "reenabled".

It is either possible to borrow once and disable who you borrow 
from, or borrow multiple time and everything become immutable for 
the time you borrow.

This makes the problems mentioned in this thread effectively 
impossible happen.


More information about the Digitalmars-d mailing list