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

Steven Schveighoffer schveiguy at yahoo.com
Thu Jun 23 06:33:28 PDT 2011


On Thu, 23 Jun 2011 00:15:12 -0400, d coder <dlang.coder at gmail.com> wrote:

>>
>>
>> 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.
>>
>
> Thanks All
>
> I would give Appender a try. Any idea if it is safe to use this struct in
> multithreaded environment. Would it be OK to add elements to it from
> multiple threads -- of course I would be using synchronized code to make
> sure that only one element gets added at a time. Any other precautions?

David Simcha has removed Appender from std.parallelism, due to a perceived  
failure during multithreaded appends (even with locking).  I don't see why  
it would happen, but you may want to be cautious.

See this commit:

https://github.com/D-Programming-Language/phobos/commit/5a3761baac147ff43f4dc2ce264a18ad5e4330bd#std/parallelism.d

-Steve


More information about the Digitalmars-d mailing list