Domanda

Sto cercando di liberare la TLIST all'interno di una TLIST in un evento onDestroy e FastMM4 sta sollevando un errore di violazione dell'accesso. Ecco lo snippet di codice.

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;

Ricevo un errore di violazione dell'accesso su Tsignal (SignAllist.items [x]). linea. Liberare articoli allarme prima di liberare gli articoli SignAllist solleva l'errore di violazione dell'accesso, ma perché?

Aggiornamento: sto usando Delphi 7.0 su Windows XP. I messaggi FastMM4 effettivi sono i seguenti.


FastMM ha rilevato un tentativo di chiamare un metodo virtuale su un oggetto liberato. Verrà ora sollevata una viloazione di accesso per interrompere l'attuale operazione.

Classe di oggetti liberati: TLIST

Metodo virtuale: distruggere

Indirizzo del metodo virtuale: 427cf0

Il numero di allocazione era: 80055

Seguito da un sacco di dump di memoria.


Secondo questo errore FastMM4, se si libera un oggetto all'interno di un altro oggetto, si libera automaticamente anche il proprietario. So che non può essere vero, ma correggimi se sbaglio.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top