On Sun, Jan 10, 2021 at 12:09 PM Sven Barth via fpc-pascal <fpc-pascal@lists.freepascal.org> wrote:
> If after the Move only one of the two references is reachable anymore > (because e.g. some internal count variable "ends" the array before that > element) then you don't need to care about increasing the reference > count, cause there is only one reference after all (in that case you > must *not* use an assignment to clear the value, but e.g. FillChar, > cause the reference count must not be touched). Only if you'd really > duplicate the element you'd need to take care of that. I came up with this: Assume that: FData is defined as Array of T (T being generic) procedure MoveDataManaged(StartIndex: SizeUInt; Offset: SizeInt; NrElems: SizeUInt); var i: SizeUInt; begin if Offset>0 then begin for i := StartIndex + NrElems-1 downto StartIndex do begin if IsManagedType(T) then //finalize before overwriting Finalize(FData[i+Offset]); FData[i+Offset] := FData[i]; if IsManagedType(T) then Finalize(FData[i]); FillChar(FData[i], SizeOf(T), 0); //erase old data, not necessary after finalize end; end else begin for i := 0 to NrElems-1 do begin if IsManagedType(T) then Finalize(FData[StartIndex+i+Offset]); FData[StartIndex+i+Offset] := FData[StartIndex+i]; if IsManagedType(T) then Finalize(FData[StartIndex+i]); FillChar(FData[StartIndex+i], SizeOf(T), 0); end; end; end; I tested this with T being Array of Char (so FData being an array of array of Char). Leaving out any of the Finalize statements will make HeapTrace barf at me about unfreed memory blocks. Does it make any sense? -- Bart _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal