[fpc-pascal] Usage of TInterfacedObject. Automatic release?
Luiz Americo Pereira Camara
pascalive at bol.com.br
Sat May 26 21:57:03 CEST 2007
Cesar Romero wrote:
> Luiz Americo,
>> Anyway, calling manually _Release avoid the leak and i will stay with
>> it for now (I hope did not break anything).
>
> It can work for that case, but I think that is not a good ideia.
>
> If you are using a TInterfacedObject descendant, it will call the
> _Release when out of context, so in that especific case seems to never
> go out of context, and then you _realease call works, but in other
> place it can go out of context before, and the you will have others AV.
>
> - As Joao suggest, the best way is create a weak reference, where when
> 2 objects need to reference each other one should use Pointer to hold
> one reference
> - Avoid circular reference
The problem here is that i'm using a third party design. And the code
complexity allied with my inexperience with interfaces/COM makes the
chance of breaking things big.
Anyway i did not find, with my limitations, any circular references
between interfaces. Exists a circular reference but is between an
Interface (IVTDragManager) and a TVirtualTreeView(TCustomControl)
already used as a weak reference (TObject).
The design is more or less the following:
TBaseVirtualTree holds a reference to a IVTDragManager.
TVTDragManager (IVTDragManager) holds a reference to TBaseVirtualTree
stored in a TObject field
TVTDragManager also holds reference for IDataObject (TVTDataObject) and
IDropTargetHelper (returned by a win32 call)
TVTDataObject holds a reference to TBaseVirtualTree as a TObject
There are two circular references:
TVTDragManager <-> TBaseVirtualTree
TBaseVirtualTree <-> TVTDragManager > TVTDataObject > TBaseVirtualTree
if someone is interested. the code is here:
http://lazarus-ccr.svn.sourceforge.net/viewvc/lazarus-ccr/components/virtualtreeview-unstable/units/win32/virtualdragmanager.pas?view=log
> - Create a Finalization method that will set one of the references to
> "nil"
Its already done. But the problem is that this finalization code is not
called (is inside the Interface Destroy). And setting the interface
reference to nil inside TBaseVirtualTree.Destroy does not help.
Luiz
More information about the fpc-pascal
mailing list