Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#7

AW: Abort verursacht MemoryLeak ?

  Alt 25. Sep 2020, 09:37
Hier steht was zu Abort

Damit wird klar, warum das list.free nicht aufgerufen wird.
Delphi-Quellcode:
  try
    Funktion_die_im_Fehlerfalle_Abort_aufruft;
  except
    on e : EAbort do begin
      ShowMessage('Abort wurde aufgerufen.');
    end;
    on e : Exception do begin
      MessageDLG(e.Message,mtError,[mbok],0);
    end;
  end;
Abort ist letztlich auch nur 'ne Exception, deren Meldung "verschluckt" wird. Man kann sie aber im Exceptionhandling "abfangen" und damit auch in dem Fall ein "vernünftiges" Weiterlaufen des Programmes sicherstellen.

Mal ein annähernd sinnfreies Beispiel zum rumprobieren:
Delphi-Quellcode:
function Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i : Integer) : Integer;
begin
  Result := 4812;
  if i < 0 then begin // Als Fehlerfall ist hier einfach mal i < 0 definiert.
    Abort;
  end else begin
    Result := Result div i;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  list : TStringList;
  k : Integer;
  i : Integer;
begin
  list := TStringList.Create;
  list.Add('irgendwas');
  list.Add('nochwas');
  i := 47;
  k := 12;
  try
    try
      // Wahlweise mit i = 0, i = -1 und i = 1 ausprobieren
      // und die Reihenfolge der Wertzuweisung zu i mal ändern.
      i := 1;
      k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
      i := -1;
      k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
      i := 0;
      k := Funktion_Bricht_Im_Fehlerfalle_Mit_Abort_ab(i);
    except
      on e : EAbort do begin
        MessageDlg(e.Message,mtError,[mbOk],0);
      end;
      on e : Exception do begin
        MessageDlg(e.Message,mtError,[mbOk],0);
      end;
    end;
    ShowMessage(Format('i = %d, k = %d',[i,k]));
  finally
    list.Free;
  end;
end;
  Mit Zitat antworten Zitat