Question

J'essaie de libérer Tlist dans un TList dans un événement OnDestroy et Fastmm4 augmente une erreur de violation d'accès. Voici l'extrait de code.

procedure TSignalFrm.FormDestroy(Sender: TObject);
var
  x,y: integer;
begin
  for x := 0 to signalList.Count - 1 do
  begin
    for y:=0 to TSignal(SignalList.Items[x]).alarmList.Count-1 do
    begin
      TAlarm(TSignal(SignalList.Items[x]).alarmList.Items[y]).Free;
    end;
    TSignal(SignalList.Items[x]).AlarmList.Free;
    TSignal(SignalList.Items[x]).Free;
  end;
  SignalList.Free;
end;

J'obtiens l'erreur de violation d'accès à tsignal (signallist.items [x]). GRATUIT; ligne. La libération des éléments d'alarme avant de libérer les éléments signallistes augmente l'erreur de violation d'accès, mais pourquoi?

MISE À JOUR: J'utilise Delphi 7.0 sur Windows XP. Les messages FastMM4 réels sont les suivants.


Fastmm a détecté une tentative d'appeler une méthode virtuelle sur un objet libéré. Une viilatation d'accès sera désormais augmentée afin d'interrompre l'opération actuelle.

Classe d'objets libérés: tlist

Méthode virtuelle: détruire

Adresse de la méthode virtuelle: 427cf0

Le numéro d'allocation était: 80055

Suivi par beaucoup de vidage de mémoire.


Selon cette erreur Fastmm4, si vous libérez un objet dans un autre objet, vous libérez automatiquement le propriétaire également. Je sais que cela ne peut pas être vrai, mais corrigez-moi si je me trompe.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top