T[new]

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Aug 9 14:08:22 PDT 2009


Brad Roberts wrote:
> Walter Bright wrote:
>> Brad Roberts wrote:
>>> Yay.  What will happen with slices over a T[new] when the underlying
>>> T[new] must
>>> be moved due to resizing?  The behavior needs to be at least well
>>> specified, if
>>> not well defined.
>> Great question! It's no different from what happens with any container
>> when its contents change and there are references to the old content.
>>
>> What won't happen is the slice won't be pointing to unallocated memory,
>> thanks to the gc. Resizing the T[new] will not cause the old contents to
>> be deleted.
>>
>> The slice will either point to the old content, if the resize caused a
>> move, or the new content, if it was resized in place. So it will still
>> be implementation-defined behavior.
>>
>> But the likelihood of getting caught by such behavior is much less
>> likely with T[new], as one can clearly see in the code where the
>> resizeables are, rather than the current situation where any slice could
>> be resized by anyone.
>>
>> I think that taking a slice of a T[new], then resizing the T[new], will
>> be rare (or at least should be). Normally, a T[new] will be built, and
>> when it is all done, it is converted to a T[] and there is no longer any
>> way to resize it.
> 
> As expected, but like I said.. this needs to be clear in the spec.  Because
> something like this is just confusing (and yes, I know it's not new behavior):
> 
>     auto a = new int[10];
>     a[0] = 1;
>     auto s1 = a[0..1];
>     a.length = <some value large enough to force a move>;
>     auto s2 = a[0..1];
>     s2[0] = 2;
>     assert(s1[0] == s2[1]); // fail
> 
> Later,
> Brad
> 

Well yah but in all languages this is the case. C++'s iterators not only 
invalidate at the drop of a hat, but you can't really tell whether 
they're invalid. Java iterators can also be invalidated and may throw an 
exception.

When resizing a D array, its underlying slices may be *orphaned*. That 
means they are still valid, they just don't refer to the same data as 
the array. I think that's a reasonable tradeoff between efficiency and 
safety.


Andrei



More information about the Digitalmars-d mailing list