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@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to