![]() |
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