Am 21.03.2013 13:55, schrieb Kostas Michalopoulos:
I haven't used (COM) interfaces so far since i didn't found any use
for them in my code, but i didn't knew about their reference counting
properties. That could save a lot of headaches i have with my 3D world
editor's lightmap generation (currently there is some wrong memory
deallocation somewhere that crashes the editor in partial lightmap
recalculations). I plan to redesign it at some point soon and i was
thinking how to handle this. Since there is native refcounting support
in FPC it makes things much easier.
However i did a small test and i noticed something that, to me (as
someone who hasn't used COM at all) looks a bit weird:
If i do a declaration like
type
IResource = interface end;
TResource = class(TInterfacedObject, IResource) ... stuff ... end;
TSomething = class
...
Resources: array of TResource;
...
end;
then reference counting doesn't work. However if i change Resources to
Resources: array of IResource;
then it works. It seems that the compiler checks only the "topmost"
type and doesn't check if TResource implements the IResource and thus
doesn't do any reference counting. Is this a bug or it is supposed to
work this way?
If the latter, is there a way to make the compiler do reference
counting on a variable that has a class type which implements an
interface instead of a type that is an interface itself? Or is there
any other form of reference counted classes?
The compiler does not check for any topmost type. It uses reference
counting only for variables that are of an interface type not for a
class type.
E.g.:
=== example begin ===
var
i: IInterface;
t: TInterfacedObject;
begin
t := TInterfacedObject.Create;
t.Free;
// no reference counting is done here
i := TInterfacedObject.Create;
i := Nil;
// reference counting is done here
end;
=== example end ===
Regards,
Sven
--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus