Managed types within records

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Managed types within records

Jürgen Hestermann
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)?

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: Managed types within records

Sven Barth-2

Am 28.05.2015 18:16 schrieb "Jürgen Hestermann" <[hidden email]>:
>
> 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  -  [hidden email]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal