Strange behavior on shrinking a Dynamic Array -- Capacity reduces to 0

Ali Çehreli acehreli at yahoo.com
Wed Jun 22 21:04:18 PDT 2011


On Wed, 22 Jun 2011 23:55:23 -0400, Robert Jacques wrote:

> On Wed, 22 Jun 2011 23:38:30 -0400, d coder <dlang.coder at gmail.com>
> wrote:
> 
>> Hello List
>>
>> As per TDPL and D documentation, shrinking a dynamic array should not
>> relocate it. But that is exactly what is happening. On shrinking an
>> array, its capacity is getting reduced to 0. Surprisingly the capacity
>> after a shrink is even less than the length of the array. As a result
>> the array gets relocated as soon as another element is added to it.
>>
>> I have to call reserve again after shrinking it to make sure that the
>> array
>> is not relocated.
>>
>> Is this the expected behavior?
> 
> Yes. Capacity is only non-zero for arrays which can safely be extended.
> If you shrink an array from length 10 to length 5, the GC is smart
> enough to know that that there may be a dangling reference to elements
> [5..10] and thus if the length 5 array was appended to, it might stomp
> on someone else's data. Long ago, the GC was dumber and it caused a
> massive hole in the const/immutable system. If you know that no other
> aliases exist (i.e. you're buffering, etc) you can use the function
> assumeSafeAppend to reset the capacity. However, I'd strongly recommend
> switching to Appender whenever you're tempted to use assumeSafeAppend.

And an article to go with that: :)

  http://www.dsource.org/projects/dcollections/wiki/ArrayArticle

Ali


More information about the Digitalmars-d mailing list