[fpc-devel] FreeNotification and opRemove

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Thu Mar 8 14:08:05 CET 2012



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.

Michael.
>
> On 08/03/2012 09:56, Martin wrote:
>> I found a behaviour, of which I am not sure, if it is intended. Maybe 
>> someone can comment
>> 
>> My understanding is that FreeNotification are *always* set up 
>> bi-directional ?
>> At least
>>   C1.FreeNotification(C2);
>> will set up for C1 to inform C2, and for C2 to inform C1 whichever is 
>> destroyed first to call the other
>> 
>> And
>>   C1.RemoveFreeNotification(C2);
>> will remove both.
>> 
>>
>>   C2.Notification(C1, opRemove);
>> breaks that.
>> It will lead to C2 removing C1 from it's list of FreeNotifies, but C1 will 
>> keep C2 on the list.
>> If then C2 is destroyed, it does not inform C1 about that, and C1 ends up 
>> with a dangling pointer to the no longer existing C2.
>> Destroying C2 will then crash.
>> 
>> In the example below (compile with -gt) opRemove is caused by 
>> Owner.RemoveComponent.
>> It crashes on the last line.
>> 
>> I was briefly wondering, if in case C1 did call "C1.FreeNotification(c2);", 
>> then C1 should overwrite Notification and check for the opRemove and call 
>> "RemoveFreeNotification" itself?
>> But if that was the case, then why does TComponent interfer with the 
>> FreeNotify list at all?
>> 
>> 
>> 
>> 
>> 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
>
> _______________________________________________
> 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