Am 08.05.2021 um 18:23 schrieb Ryan Joseph via fpc-devel:
It's not about reference counted classes vs. managed records, but about
whether it's *per type* or *per variable*, the implementation details
are completely irrelevant for now.
On May 8, 2021, at 7:59 AM, Sven Barth via fpc-devel
It has the exact same problems that my branch had (especially the interaction
of reference counted instances with non-reference counted ones).
Using a variable/parameter/field based approach (like the idea with managed
records and default fields) is the more flexible one compared to the type or
instance based one and thus it's more favorable.
I still don't understand how the record approach is that much different from a managed
class type which calls the same set of management operators. Can we make a pros-cons
list to clear this up and give an example of "especially the interaction of
reference counted instances with non-reference counted ones"?
Here's the most recent things we brought up:
- Records can't be cast in a way that would break reference counting (like a
managed class being cast to TObject would).
- Generic records would create a proliferation of new types for all classes you wanted managed, so instead of using
TFPGList<TSomeObject> you're using TManagedSomeObjectList or TManaged<TFPGList<TSomeObject>>, or
worse yet "specialize TManaged<specialize TFPGList<TSomeObject>>"
Otherwise the same set of circular references exists but I'm not sure about
your concern about mixing managed types yet.
And the problems are assigning a reference counted class instance to a
non-reference counted variable or parameter. Also casting such a
reference counted class to a non-reference counted one (e.g. to
TObject). Allowing these kind of operations would either need to be
forbidden which would restrict the usability of such classes or they
could potentially lead to memory leaks or premature freeing. Not to
mention how calling the destructor would react if the reference count
By using a mechanism based on the variable/field/parameter type you have
a much more fine grained control and if one leaves out the implicit
assignment from the wrapped class type to the non-wrapped one then one
needs to do an explicit conversion.
fpc-devel maillist - email@example.com