[fpc-devel] FreeNotification and opRemove

Martin lazarus at mfriebe.de
Thu Mar 8 14:44:19 CET 2012


On 08/03/2012 13:34, Martin wrote:
> On 08/03/2012 13:08, michael.vancanneyt at wisa.be wrote:
>>
>>
>> On Thu, 8 Mar 2012, Martin wrote:
>>
>>> Further more:
>>>
>>> the program below, does not crash in delphi (turbo delphi)
>>
>> I also noticed. I suspect the problem is the owner; If it gets a free 
>> notification, it should pass it to all the children.
>
> I don't think that is it.
>
> In the example below C1 is no longer owned, when C2 is destroyed, so 
> the problem would persist.
>
> The problem is that opRemove breaks the bi-directional bounding of 
> FreeNotifications.
>
> When C2 gets the opREmove, it must mot just remove it's own entry, but 
> also remove the entry C1 has
>

In the following code, I thing is the problem:

Procedure TComponent.Notification(AComponent: TComponent;
   Operation: TOperation);
Var Runner : Longint;
begin
   If (Operation=opRemove) and Assigned(FFreeNotifies) then
     begin
     FFreeNotifies.Remove(AComponent);
...

It removes only one of the 2 notify entries.

If opRemove is to remove FreeNotifications, then it mus remove them 
bi-directional, same as RemoveFreeNotification does


>
>>>
>>> On 08/03/2012 09:56, Martin wrote:
>>>>
>>>> program Project1;
>>>> {$mode objfpc}{$H+}
>>>> uses  Classes;
>>>> var
>>>>   Owner, C1, C2: TComponent;
>>>> begin
>>>>   Owner := TComponent.Create(nil);
>>>>   C1 := TComponent.Create(Owner);
>>>>   C2 := TComponent.Create(Owner);
>>>>
>>>>   C1.FreeNotification(c2);
>>>>
>>>>   Owner.RemoveComponent(C1); // C2 Gets on opRemove
>>>>   C2.Free;
>>>>   C1.Free; // crash
>>>>
>>>>   ReadLn;
>>>> end.
>>>>
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel




More information about the fpc-devel mailing list