[fpc-devel] FreeNotification and opRemove

Martin lazarus at mfriebe.de
Thu Mar 8 11:43:13 CET 2012


Further more:

the program below, does not crash in delphi (turbo delphi)

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




More information about the fpc-devel mailing list