AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation bei Free()

Ein Thema von hitzi · begonnen am 3. Dez 2004 · letzter Beitrag vom 3. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

EAccessViolation bei Free()

  Alt 3. Dez 2004, 10:59
Hallo,

hat jemand eine Idee warum bei folgenden Codestück ein EAccessViolation Fehler kommt?
Delphi-Quellcode:
destructor TMobilePIM.Free;
begin
  fTimer.Enabled := false;
  if assigned(FTimer) then FreeAndNil(fTimer);
  inherited Free(); //Hier kommt der Fehler
end;
Ab und zu kommt auch " ... raised too many consecutive exceptions ...". Ausgeführt mit Delphi 2005 Architect Trial.

Gruss
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:03
Mmh. Als Destructor wird Destroy verwendet und nicht free. Durch Free wird Destroy explizit aufgerufen. Es müsste also so aussehen:

Delphi-Quellcode:
destructor TMobilePIM.Destroy;
begin
  fTimer.Enabled := false;
  if assigned(FTimer) then FreeAndNil(fTimer);
  inherited;
end;
[Edit]Weiss nicht genau wie das bei Delphi 2005 ist, sollte aber bei einer Win32 Anwendung genauso sein.[/edit]
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#3

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:09
Ich hab's mal geändert. Jetzt wird allerdings dieser Destructor nicht mehr aufgerufen.

Hier die Procedure, welche das einleitet:
Delphi-Quellcode:
procedure TfrmContactDetails.FormDestroy(Sender: TObject);
begin
  if Assigned(fPim) then //fPim = TMobilePIM
  begin
    fPim.OnRefreshData := nil;
    fPim.Free;
    fPim := nil;
  end;
end;
und die geänderte Version:
Delphi-Quellcode:
destructor TMobilePIM.Destroy;
begin
  fTimer.Enabled := false;
  if assigned(FTimer) then FreeAndNil(fTimer);
  inherited Free();
end;
und die Deklaration unter Public:

destructor Destroy();reintroduce; Auch wenn ich FreeAndNil(fPim) aufrufe, wird TMobilePim.Destroy nicht aufgerufen (jedenfalls nicht beim Schritt für Schritt Debuging.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:09
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.
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#5

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:12
Ok Mario, hab's so geändert:

Delphi-Quellcode:
destructor TMobilePIM.Destroy;
begin
  if assigned(FTimer) then
  begin
    fTimer.Enabled := false;
    FreeAndNil(fTimer);
  end;
  inherited Free();
end;
Was passiert eigentlich, wenn das OnTimer Ereignis aufgerufen wird und genau in dem Moment der Timer freigegeben wird?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#6

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:15
Zitat von jim_raynor:
Weiss nicht genau wie das bei Delphi 2005 ist, sollte aber bei einer Win32 Anwendung genauso sein.
Es ist eine Win32 Anwendung.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#7

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:24
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
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#8

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:27
Mit folgender Procedure funktionierst:

Delphi-Quellcode:
procedure TMobilePIM.Free;
begin
  if assigned(FTimer) then
  begin
    fTimer.Enabled := false;
    FreeAndNil(fTimer);
  end;
  inherited Free();
end;
So aufgerufen:
Delphi-Quellcode:
procedure TfrmContactDetails.FormDestroy(Sender: TObject);
begin
  if Assigned(fPim) then //fPim = TMobilePIM
  begin
    fPim.OnRefreshData := nil;
    fPim.Free;
    fPim := nil;
  end;
end;
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.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 11:53
Zitat von hitzi:
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.
Das sollte eigentlich funktionieren.

FreeAndNil ist in der SysUtils enthalten und hat folgenden Quelltext:
Delphi-Quellcode:
...
{ 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;
...
Es wird also die Free Methode des Objektes aufgerufen.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#10

Re: EAccessViolation bei Free()

  Alt 3. Dez 2004, 12:04
Wird's aber nicht

Wieso wird das eigentlich so von Borland gelöst.
Wäre ein
Delphi-Quellcode:
Obj.Free;
Obj := nil;
nicht kürzer und schneller?
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz