Am 28.05.2015 18:16 schrieb "Jürgen Hestermann" <juergen.hesterm...@gmx.de>:
>
> Hi,
>
> when I have a record which has managed types (i.e. strings),
> how are they handled by the compiler when I assign one record to the
other?
> Example:
>
> ---------------------------------------------------
> type MyRecordType = record
>                                       X : SizeInt;
>                                       S : AnsiString;
>                                       end;
> var A,B : ^MyRecordType;
>
> begin
> new(A);
> new(B);
> A^.X := 7;
> A^.S := 'String in A';
> B^ := A^;
> Dispose(A);
> end;
> ---------------------------------------------------
>
> What happens to the reference counter of S?
> Is it updated correctly (assigned to zero with new,
> incremented with B^:=A^ and decremented with dispose)?

Yes, they are handled correctly. The compiler inserts a call to a RTL
function that does a per-element copy using the record's RTTI instead of
doing a memory copy (this is true for all records even if they don't have
managed types).

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to