![]() |
Probleme mit TObject.Free
Hallo zusammen erstmal!
Ich hätte da mal en kleines Problem und hoffe hier kann mir jemand weiterhelfen :-D Ich habe ein eigenes Objekt nach folgendem Schema definiert:
Delphi-Quellcode:
das Objekt lässt sich mit Create herstellen und mit Free zerstören
type
TMyObj = class(TObject) public constructor Create(Param:String); destructor Destroy; override; private procedure DoSomething; end;
Delphi-Quellcode:
So, nun das Problem:
procedure Foobar;
var MyObj: TMyObj; begin try MyObj := TMyObj.Create('Oi!'); MyObj.DoSomething; [...] finally MyObj.Free; end; end; 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? |
Re: Problem with TObject.Free
Hallo
.free setzt das object nicht automatisch auf Nil, das mußt du selbst tun. Dafür gibt es
Delphi-Quellcode:
Mfg Frank
FreeAndNil(myobject);
|
Re: Probleme mit TObject.Free
Cool, danke für die superschnelle Antwort :-D
Warrum steht sowas nich in der Anleitung ??? Sollte ich dann also immer FreeAndNil(MyObj) anstatt MyObj.Free benutzen, damit der Speicher korrekt freigegeben wird? |
Re: Probleme mit TObject.Free
Bin gerade auch mit so was beschäftigt. Versuche das hier mal :
Delphi-Quellcode:
Allerdings wäre interessant zu wissen, wo das Objekt herkommt / rzeugt wird.
Abject.Destroy;
Aject := nil; |
Re: Probleme mit TObject.Free
@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... |
Re: Probleme mit TObject.Free
Hab grad en Beispiel gefunden. Schaut mal hier:
![]() |
Re: Probleme mit TObject.Free
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. |
Re: Probleme mit TObject.Free
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. |
Re: Probleme mit TObject.Free
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 |
Re: Probleme mit TObject.Free
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!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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