How can I clean array and prevent further reallocation if there's enough space already?

Jack jckj33 at gmail.com
Mon Feb 8 01:15:12 UTC 2021


On Sunday, 7 February 2021 at 21:55:34 UTC, Adam D. Ruppe wrote:
> On Sunday, 7 February 2021 at 21:40:12 UTC, Jack wrote:
>> I think it would be fine except it assumes the number of items 
>> of the array to doesn't grow, it rather overwritten new 
>> elements
>>
>> from docs:
>>
>> "Use this only when it is certain there are no elements in use 
>> beyond the array in the memory block. If there are, those 
>> elements will be overwritten by appending to this array."
>
> That's referring to a case like this:
>
> int[] a = [1, 2, 3, 4, 5];
> int[] b = a[0 .. 3];
>
> Normally, if you were to do
>
> b ~= 6;
>
> it would allocate a new array for b, leaving a alone.
>
> a == [1, 2, 3, 4, 5];
> b == [1, 2, 3, 6];
>
> a.ptr != b.ptr because b got reallocated.
>
>
>
> If you assumeSafeAppended there though, the b ~= 6 would reuse 
> the remainder of the block.
>
> b.assumeSafeAppend();
> b ~= 6;
>
> a == [1, 2, 3, 6, 5];
> b == [1, 2, 3, 6];
>
> a.ptr == b.ptr; // assumeSafeAppend meant no reallocation
>
>
>
>
> So the "elements in use beyond the array in the memory block" 
> are referring to the variable a in the example still having [4, 
> 5] at the end. Since that 4 gets overwritten by the 6, if you 
> weren't prepared for this, it can be a surprising bug.
>
> The docs also say this is "undefined behavior" simply because 
> the 4 won't *always* get overwritten by the 6. well, in this 
> case the 4 is always overwritten by the 6, but say I wanted to 
> append [6, 7, 8], then it might reallocate anyway because the 
> memory block is only big enough for two new elements, not 
> three. If that happened, that 4 would stay put.
>
> So the array is allowed to grow as much as it wants, just in 
> some cases it will overwrite existing data and in other cases 
> it will realloc a new slice to make room.

got it, thank you very much!


More information about the Digitalmars-d-learn mailing list