![]() |
EAccessViolation bei Free()
Hallo,
hat jemand eine Idee warum bei folgenden Codestück ein EAccessViolation Fehler kommt?
Delphi-Quellcode:
Ab und zu kommt auch " ... raised too many consecutive exceptions ...". Ausgeführt mit Delphi 2005 Architect Trial.
destructor TMobilePIM.Free;
begin fTimer.Enabled := false; if assigned(FTimer) then FreeAndNil(fTimer); inherited Free(); //Hier kommt der Fehler end; Gruss |
Re: EAccessViolation bei Free()
Mmh. Als Destructor wird Destroy verwendet und nicht free. Durch Free wird Destroy explizit aufgerufen. Es müsste also so aussehen:
Delphi-Quellcode:
[Edit]Weiss nicht genau wie das bei Delphi 2005 ist, sollte aber bei einer Win32 Anwendung genauso sein.[/edit]
destructor TMobilePIM.Destroy;
begin fTimer.Enabled := false; if assigned(FTimer) then FreeAndNil(fTimer); inherited; end; |
Re: EAccessViolation bei Free()
Ich hab's mal geändert. Jetzt wird allerdings dieser Destructor nicht mehr aufgerufen.
Hier die Procedure, welche das einleitet:
Delphi-Quellcode:
und die geänderte Version:
procedure TfrmContactDetails.FormDestroy(Sender: TObject);
begin if Assigned(fPim) then //fPim = TMobilePIM begin fPim.OnRefreshData := nil; fPim.Free; fPim := nil; end; end;
Delphi-Quellcode:
und die Deklaration unter Public:
destructor TMobilePIM.Destroy;
begin fTimer.Enabled := false; if assigned(FTimer) then FreeAndNil(fTimer); inherited Free(); end;
Delphi-Quellcode:
Auch wenn ich FreeAndNil(fPim) aufrufe, wird TMobilePim.Destroy nicht aufgerufen (jedenfalls nicht beim Schritt für Schritt Debuging.
destructor Destroy();reintroduce;
|
Re: EAccessViolation bei Free()
Den Timer erst zu Disablen und dann nach Prüfung freizugeben, ist teilweise sinnfrei. Wenn der Timer disabled werden kann, muss er auch existieren, dann kann die Prüfung mit Assigned danach einfach entfallen.
|
Re: EAccessViolation bei Free()
Ok Mario, hab's so geändert:
Delphi-Quellcode:
Was passiert eigentlich, wenn das OnTimer Ereignis aufgerufen wird und genau in dem Moment der Timer freigegeben wird?
destructor TMobilePIM.Destroy;
begin if assigned(FTimer) then begin fTimer.Enabled := false; FreeAndNil(fTimer); end; inherited Free(); end; |
Re: EAccessViolation bei Free()
Zitat:
|
Re: EAccessViolation bei Free()
Mit dem 'reintroduce' verdeckst Du das Vorgänger-Destroy, es muss 'override' heissen. Ausserdem nur 'inherited;' und nicht 'inherited free;'.
In einer Single-Thread-Anwendung kann es nicht passieren, dass der Timer zerstört wird, während OnTimer aufgerufen wird. (Solltest Du natürlich auch nicht durch einen Aufruf im OnTimer provozieren.) Es reicht also, den Timer nur freizugeben. Gruß, teebee |
Re: EAccessViolation bei Free()
Mit folgender Procedure funktionierst:
Delphi-Quellcode:
So aufgerufen:
procedure TMobilePIM.Free;
begin if assigned(FTimer) then begin fTimer.Enabled := false; FreeAndNil(fTimer); end; inherited Free(); end;
Delphi-Quellcode:
Eine letzte Frage dazu. fPim.Free und fPim := nil funktionieren ja - wieso funktioniert FreeAndNil(fPim) nicht? Bei FreeAndNil wird nicht! die Procedure TMobilePIM.Free aufgerufen.
procedure TfrmContactDetails.FormDestroy(Sender: TObject);
begin if Assigned(fPim) then //fPim = TMobilePIM begin fPim.OnRefreshData := nil; fPim.Free; fPim := nil; end; end; |
Re: EAccessViolation bei Free()
Zitat:
FreeAndNil ist in der SysUtils enthalten und hat folgenden Quelltext:
Delphi-Quellcode:
Es wird also die Free Methode des Objektes aufgerufen. :gruebel:
...
{ Copyright (c) 1995-2002 Borland Softwrare Corporation } ... unit SysUtils; ... procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; ... |
Re: EAccessViolation bei Free()
Wird's aber nicht :(
Wieso wird das eigentlich so von Borland gelöst. Wäre ein
Delphi-Quellcode:
nicht kürzer und schneller?
Obj.Free;
Obj := nil; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz