AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit TObject.Free

Ein Thema von LoRd-MuldeR · begonnen am 9. Okt 2005 · letzter Beitrag vom 11. Okt 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#1

Probleme mit TObject.Free

  Alt 9. Okt 2005, 17:38
Hallo zusammen erstmal!
Ich hätte da mal en kleines Problem und hoffe hier kann mir jemand weiterhelfen

Ich habe ein eigenes Objekt nach folgendem Schema definiert:

Delphi-Quellcode:
type
  TMyObj = class(TObject)
  public
    constructor Create(Param:String);
    destructor Destroy; override;
  private
    procedure DoSomething;
  end;
das Objekt lässt sich mit Create herstellen und mit Free zerstören

Delphi-Quellcode:
procedure Foobar;
var
  MyObj: TMyObj;
begin
  try
    MyObj := TMyObj.Create('Oi!');

    MyObj.DoSomething;
    [...]
  finally
    MyObj.Free;
  end;
end;
So, nun das Problem:

Ich habe festgestellt, dass ein erneuter Aufruf von .Free - also wenn das Object bereits mit .Free zerstört wurde - zu einem Exception Error führt (Memory Access Violation). So weit ich es verstanden hab, sollte das Objekt doch nach dem ersten .Free aufruf zerstört und somit wieder nil sein. Ein zweiter Aufruf von .Free sollte dies erkennen und keinen Fehler verursachen. Das is doch der Grund, warrum ich .Free anstatt .Destory aufrufe, oder? Iregndwie schein meint Objekt aber nach dem Zerstören durch .Free nich nil zu werden. Ergo: Der Speicher wurde nich korrekt freigegeben.

Wo steckt bloß der Fehler ???
Oder hab ich da was falsch verstanden?
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Problem with TObject.Free

  Alt 9. Okt 2005, 17:43
Hallo
.free setzt das object nicht automatisch auf Nil, das mußt du selbst tun. Dafür gibt es
FreeAndNil(myobject); Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#3

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 17:46
Cool, danke für die superschnelle Antwort

Warrum steht sowas nich in der Anleitung ???

Sollte ich dann also immer FreeAndNil(MyObj) anstatt MyObj.Free benutzen, damit der Speicher korrekt freigegeben wird?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 17:47
Bin gerade auch mit so was beschäftigt. Versuche das hier mal :

Delphi-Quellcode:
Abject.Destroy;
Aject := nil;
Allerdings wäre interessant zu wissen, wo das Objekt herkommt / rzeugt wird.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#5

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 17:50
@Hansa:

Du solltest .Free anstatt .Destroy aufrufen, so viel is sicher.
Aber scheint so, als ob du das Objekt hinterher noch manuell auf nil setzten musst!
Ich denke am besten isses dieses FreeAndNil(TObject) zu benutzen, wie es Keldorn vorgeschlagen hat...
  Mit Zitat antworten Zitat
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#6

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 17:59
Hab grad en Beispiel gefunden. Schaut mal hier:
http://www.delphibasics.co.uk/RTL.asp?Name=FreeAndNil
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#7

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 18:33
Zur Erklärung:

Myobj.free zerstört das Objekt und gibt den Speicherplatz frei.
MyObj := nil setzt die Referenz auf das Objekt zurück, denn Myobj ist nicht das Objekt sondern ein Zeiger darauf.
  Mit Zitat antworten Zitat
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#8

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 19:03
Okay, soweit verstanden.

Aber wozu is eine Referenz auf ein zerstörtes Objekt gut, so wie es .Free hinerlässt?
Das führt doch höchstens zu Exceptions, z.B. wenn man nochmal .Free benutzt!

Also werde ich dann zukünftig FreeAndNil(TObject) anstatt TObject.Free benutzen, um Probleme zu vermeiden.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 19:08
Hallo Lord,

das dangling pointer problem entsteht erst durch globale Zeigervariablen. Je mehr solche globalen Variablen du eliminierst, desto bedeutungsloser werden deine Maßnahmen zur Eindämmung möglicher Programmschäden - am Ende kannst du wieder rein objekt-orientiert mit der Methode Free() arbeiten.

Grüße vom marabu

damned dropped characters
  Mit Zitat antworten Zitat
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR

Registriert seit: 9. Okt 2005
Ort: Somewhere over the Slaughterhouse
132 Beiträge
 
Delphi 7 Professional
 
#10

Re: Probleme mit TObject.Free

  Alt 9. Okt 2005, 19:45
Das Problem lässt sich aber in meinem Fall nich so ohne weiteres Umgehen, da ich teilweise nich vorhersagen kann, ob das Objekt bereits zerstört wurde. Natürlich gäbe es da auch wege, das Problem anders zu lösen. Aber FreeAndNil(Obj) scheint doch ne ganz elegante Lösung zu sein!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:00 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