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