[fpc-pascal] Question about Deleting elements in Dynamic Array

Vincent Snijders vsnijders at vodafonevast.nl
Wed Apr 28 08:37:11 CEST 2010


Bihar Anwar schreef:
> I've tried to use Move() instead of Copy(). Any objection with the following code?

Yes, at first glance without much thinking, I don't think it is safe. Did you think 
through the consequences of copying reference counted types (ansistring in this case 
  presumably)?

> 
> var
>   a: array of string;

shortstring of ansistring?

> 
> SetLength(a, 5);
> a[0] := 'aa'; a[1] := 'bb'; a[2] := 'cc'; a[3] := 'dd'; a[4] := 'ee';
> 
> System.Move(a[3], a[0], 2 * SizeOf(string) );    // instead of  a := Copy(a, 3, 2);
> SetLength(a, 2);

Hmm, maybe you are lucky and this does work without crashes, because the contents of 
  the ansistrings are constants. If they were variable strings, then then the move 
would make a[3] and a[0] point to the same string (with reference count 1). The 
setlength would free it, because it frees the memory of the ansistring in a[3].

Vincent



More information about the fpc-pascal mailing list