4 votes

Appeler aControl.free à l'intérieur de aControl

Après avoir lu ceci, j'aimerais savoir quel est le problème avec le code suivant :

procedure TForm1.Button5Click(Sender: TObject);
begin
  Button5.free;
end;

5voto

Mason Wheeler Points 52022

Placez un point d'arrêt sur cette routine et examinez la pile d'appels. Une fois que vous revenez de l'event handler, il y a encore du code de Button5 qui s'exécute, ainsi que d'autres codes VCL qui s'attend à ce que Button5 soit toujours là. Si vous supprimez l'objet en dessous, il y a de fortes chances que vous corrompiez la mémoire ou que vous déclenchiez des exceptions d'une manière ou d'une autre.

Si vous voulez faire cela, la bonne méthode est d'appeler PostMessage et d'envoyer un message au formulaire qui finira par libérer l'objet en toute sécurité une fois le code actuel terminé.

1voto

user246408 Points 20110

Le code est le pire genre de bogue car il ne se révèle pas dans 99,99% des cas. Vous libérez un objet (contrôle de bouton) alors que VCL suppose que l'objet existe. Ce qui se passe en réalité, c'est que la mémoire de l'objet est libérée, mais pas encore réutilisée, donc le code ci-dessus fonctionnera normalement, comme si l'objet n'avait pas encore été libéré, mais c'est quand même un bogue.

Le bogue simple suivant illustre la situation :

type
  PData = ^TData;
  TData = record
    Value: Integer;
  end;

procedure NastyBug;
var
  P: PData;

begin
  New(P);
  P^.Value:= 2;
  Dispose(P);
// code malicieux et buggé
  ShowMessage(IntToStr(P^.Value));
  P^.Value:= 22;
  ShowMessage(IntToStr(P^.Value));
end;

Vous pouvez tester le code ci-dessus et il devrait fonctionner comme prévu, car la mémoire libérée pour P n'est pas encore réutilisée, mais le code est clairement un bug.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X