![]() |
Gibt TObject Speicherplatz wieder frei ?
Hi,
ich habe hier eine Prozedur, deren Parameterliste wird immer größer. Die habe ich jetzt umgebaut in ein TObject. Brauche 2 Methoden und die vorherigen Paramter sind nun Felder vom TObject. Die Delphi-Hilfe ist nun recht knapp und etwas irreführend. Offensichtlich muß ich die Dinger mit Create erzeugen, aber wie siehts mit der Freigabe aus ? |
Re: Gibt TObject Speicherplatz wieder frei ?
moin Hansa,
vllt
Delphi-Quellcode:
raik
DieDinger.free
|
Re: Gibt TObject Speicherplatz wieder frei ?
"Wer was erzeugt, ist auch für die Freigabe verantwortlich".
Du musst das Objekte selber mit .Free wieder freigeben. Am besten macht das die Funktion bzw. das übergeordnete Objekt, das auch dein Hilfobjekt erzeugt hat. |
Re: Gibt TObject Speicherplatz wieder frei ?
Delphi-Quellcode:
;)
procedure DoSomething (Obj: TMyObj);
begin Obj.DoSomethingElse; Form1.Caption := Obj.Text; end; // ... begin Obj := TMyObj.Create; Obj.FillWithData; DoSomething (Obj); Obj.Free; end; Hilft dir das ? |
Re: Gibt TObject Speicherplatz wieder frei ?
Mann, seid ihr flott. :mrgreen:
Aber was hat das hier zu bedeuten : Zitat:
|
Re: Gibt TObject Speicherplatz wieder frei ?
also Create nicht direkt aufrufen :shock:
Ich glaube, das Risiko kannst du eingehen ;) .Destroy gibt den Speicher frei, .Free:
Delphi-Quellcode:
freeAndNil:
if xyz <> nil then
yxz.Destroy
Delphi-Quellcode:
(in etwa ;))
xyz.free;
xyz := nil; |
Re: Gibt TObject Speicherplatz wieder frei ?
Den Konstruktor aufrufen bedeutet
Delphi-Quellcode:
Den Konstruktor explizit aufrufen wäre
obj := TObject.Create;
Delphi-Quellcode:
;)
obj.Create
|
Re: Gibt TObject Speicherplatz wieder frei ?
Habe die erste Variante verwendet. Aber, wie gesagt, es geht um das danach, also das freigeben.
|
Re: Gibt TObject Speicherplatz wieder frei ?
:shock: Wie kann man 5000 Beiträge in einem Delphi-Forum sammeln ohne...schon gut. Resourcenschutzblock nicht vergessen. :warn:
Delphi-Quellcode:
Wenn das Objekt im Constructor Instanzen von anderen Klassen erzeugt, müssen die unbedingt im Destructor wieder freigegeben werden.
procedure foo;
var Inst: TMyObject; begin //Instanz erzeugen Inst := TMyObject.Create; try //Etwas machen, das eine Exception auslösen kann Inst.DoSomething; finally //Sicherstellen, dass das Objekt freigegeben wird Inst.Free; end; //Ab hier nicht mehr auf Inst zugreifen, sonst AV end;
Delphi-Quellcode:
edit: fehler im code beseitigt
type
TMyObject = class(TObject) private FStrings: TStrings; procedure SetStrings(Value: TStrings); public constructor Create; destructor Destroy; override; published property Strings: TStrings read FStrings write SetStrings; end; implementation constructor TMyObject.Create; begin inherited; FStrings := TStringlist.Create; end; destructor TMyObject.Destroy; begin FStrings.Free; inherited; end; procedure TMyObject.SetStrings(Value: TStrings); begin If Assigned(Value) then FStrings.Assign(Value); end; |
Re: Gibt TObject Speicherplatz wieder frei ?
Zitat:
|
Re: Gibt TObject Speicherplatz wieder frei ?
Sag mal Hansa, was ist den nmit dir los? Du programmierst doch schon eine ganze Weile und jetzt solche Fragen? :shock:
Also, Destroy sollte man nie direkt aufrufen, sondern nur über die Methode Free, da Free vorher prüft, ob das Objekt nicht nil ist. Erzeugst du in deiner Klasse weitere Instanzen, überschreibst du Destroy in deiner Klasse, gibst aber die Instanz der Klasse selber mit Free frei.
Delphi-Quellcode:
So. Free wirft die Instanze aus dem Speicher, aber der Zeiger wird nicht auf nil gesetzt. So das nach dem Free ein Test auf nil immer noch True ergibt. Entweder man setzt den Zeiger nun von Hand auf nil oder man läßt es die VCL machen und nutzt die Prozedur FreeAndNil.
type
TExample = class(TObject) private sl: TStringList; public Constructor Create; Destructor Destroy; override; end; Constructor TExample.Create; begin inherited; sl := TStringList.Create; end; Destructor TExample.Destroy; begin ShowMessage('Kuckuck'); sl.Free; inherited Destroy; end; procedure TForm1.Button1Click(Sender: TObject); var MyExample: TExample; begin MyExample := TExample.Create; try finally MyExample.Free; end; end; Ich verstehe jetzt aber nicht so ganz dein Problem, denn das kann es ja nicht gewesen sein, denn das hast du ja hoffentlich schon drauf, ansonsten wüßte ich nicht, wie du bisher mit deinen Programmen Geld verdient hast. :gruebel: |
Re: Gibt TObject Speicherplatz wieder frei ?
Das Thema interessiert wirklich nur am Rande. 8) Ich will die Parameter in der Prozedur ersetzen. Reicht da nicht ein bloßes free ? Es geht um keine komplexen Strukturen ! Ich will z.B. so was :
Delphi-Quellcode:
ersetzen mit TObject-Feldern. Das ist auf Dauer übersichtlicher. 8)
procedure SchreibeDatei (ID_KUNDE,
ID_ART, Ges integer; EKpreis, VKpreis : real; gratis, zurueck : boolean); |
Re: Gibt TObject Speicherplatz wieder frei ?
Die Felder vom Typ TObejct müssen ja irgendwo erzeuugt werden und wen ndu keine Speicherlecks produzieren willst, musst du sie auch wieder freigeben. Psote doch mal Code, wie du dir das konkret vorstellst.
|
Re: Gibt TObject Speicherplatz wieder frei ?
Wie gesagt, ich will lediglich von der ellenlangen Prozedur-Parameterliste weg ! Hier ist das (stark reduzierte) TObject :
Delphi-Quellcode:
Hier ist die Prozedur :
TStatSpeichern = class(TObject)
monat, jahr, menge : smallint; ... public procedure SchreibeStat (KuNr : integer); end;
Delphi-Quellcode:
Das ist zwar jetzt eine SQL Stored Procedure tut aber nichts zur Sache. Allerdings bin ich gerade am überlegen, ob ein Create nicht etwa sogar überflüssig ist. :gruebel:
procedure TStatSpeichern.SchreibeStat (KuNr : integer);
begin with EingDM.StatSP do begin ParamByName ('MONAT').AsInteger := monat; ParamByName ('JAHR').AsInteger := jahr; ParamByName ('MENGE').AsInteger := Menge; ... ExecProc; end; end; |
Re: Gibt TObject Speicherplatz wieder frei ?
Das ist nichts weiter als eine Klasse mit TObject als Vorfahre. Und um sie benutzen zu können, wirst du eine Instanz erstellen müssen und die musst du wieder aus dem Speicher entfernen. Wie, das haben wir dir schon erklärt.
|
Re: Gibt TObject Speicherplatz wieder frei ?
Es sieht so aus, daß sogar der Vorfahre überflüssig ist ! Also OOP pur. 8)
|
Re: Gibt TObject Speicherplatz wieder frei ?
TObject ist immer (erster) Vorfahre. Ob du es nun explizit angibst oder nicht ist völlig unerheblich. (Hatten wir das nicht auch schon mal vor einiger Zeit diskutiert? 8))
|
Re: Gibt TObject Speicherplatz wieder frei ?
Jupp, war, glaube ich, irgendwie im Zusammenhang mit meinem Klassen-Tutorial oder so.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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