Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Listen Objekte und Speicherfreigabe notwendig?


rushifell - Mi 18.04.18 18:56
Titel: Listen Objekte und Speicherfreigabe notwendig?
Hallo,

muss ich bei folgendem Code Speicher freigegeben oder wird der Speicher beim Aufruf von Clear bzw. Freigeben durch Free automatisch freigegeben. Bin mir nicht sicher, hab dazu aber auch nichts Konkretes gefunden.


Delphi-Quelltext
1:
2:
3:
4:
5:
Var S:String;
begin
ListBox1.AddItem('zeile', TObject(PChar(S)));
Edit1.Text:=PChar(ListBox1.Items.Objects[ListBox1.ItemIndex]);
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var i:Integer;
...

with ListView1.Items.Add do
begin
Data := Pointer(i);
end;
...
i:= integer(Listview1.Items[0].Data);



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
S: String;
i:Integer;
Strg: TStringlist;
...
Strg.AddObject(s, Tobject (i));
i:=Integer(Strg.Objects[0]);


Danke


Delete - Mi 18.04.18 19:30

- Nachträglich durch die Entwickler-Ecke gelöscht -


rushifell - Do 19.04.18 07:12

Vielen Dank, auch für den Tipp mit ReportMemoryLeaksOnShutdown. Das wusste ich nicht.

In Lazarus gibt's das nicht, man kann aber die heaptrc-Unit einbinden:
Unter "Projekt - Projekteinstellungen" im Bereich Compilereinstellungen auf Debuggen und dann "heaptrc-Unit verwenden (-gh)" aktivieren.


jaenicke - Do 19.04.18 10:58

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du etwas über den Konstruktor nicht erzeugt hast, dann hast du auch nichts zum freigeben.
Nun ja, was in Fall 1 passiert ist ja, dass ein Zeiger auf den String zurückgeliefert wird. Dieser Zeiger wird dann in die Liste gepackt. Sauber ist das nicht...

Ich würde generell empfehlen nicht solche Hacks zu verwenden. Neben with ist so etwas die häufigste Ursache für Fehler beim Kompilieren mit einer neueren Version von Delphi oder schwer zu findende Bugs. Wenn man das sauber umsetzt, hat man später viel weniger Probleme.

Für professionelle Entwicklung zumindest ist so etwas ein No-Go. Privat muss das jeder selbst entscheiden.


rushifell - Do 19.04.18 13:20

Nein, das will ich eben nicht, und deshalb stelle ich hier meine Frage. Dass es funktioniert, weiss ich ja. Mit Data von Listview habe ich auch ein ungutes Gefühl. Ich glaube, das einzige, was wirklich unproblematisch ist, ist das dritte Beispiel mit Addobject. Wie mache ich es besser, eine Klasse erstellen, in der der String gespeichert wird?

"With" benutze ich übrigens nie in meinem eigenen Quellcode, das war nur Faulheit. Copy und Paste geht am Smartphone leichter, als selbst tippen.


Delete - Do 19.04.18 15:17

- Nachträglich durch die Entwickler-Ecke gelöscht -


jaenicke - Fr 20.04.18 09:28

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Die Daten können zuvor in einer TStringList, TList, TObjectList, ... aufbereitet, und an jenes Steuerelement übergeben werden.
Genau, und als Referenz kann man dann den Index einer Liste oder ein echtes Objekt an die Controls hängen. Beides ist unproblematisch, weil die Daten an sich dann ja nicht am Control hängend verwaltet werden.

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Hinter der with-Anweisung steckt nichts böses. Es verhält sich wie ein scharfes Küchenmesser, oder wie ein Kraftfahrzeug mit explosiven Treibstoff - unter falscher Handhabung kann es böse enden, ansonsten nicht.
Eben nicht. Auch bei vollkommen richtiger Anwendung kann es passieren, dass es nach einem Delphi-Upgrade Kompilierfehler gibt. Und dann muss man erst schauen was eine Eigenschaft des with-Objekts war und was eine äußere Eigenschaft, so dass man dann unnötig Zeit und Nerven verliert.
Im schlechtesten Fall gibt es gar keinen Fehler beim Kompilieren, aber es wird stillschweigend eine neu eingeführte gleichnamige Property des with-Objekts benutzt.

Da sind auch sehr viele drauf reingefallen als z.B. TRect um ich glaube Width und Height erweitert wurde.... so auch in der Virtual String Tree. Die hätte ohne das with problemlos mit neueren Versionen kompiliert damals.


Delete - Fr 20.04.18 11:54

- Nachträglich durch die Entwickler-Ecke gelöscht -


jasocul - Fr 20.04.18 12:25

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Überwiegend funktioniert die with-Anweisung so wie sie soll.

Auf Überwiegend würde ich mich lieber nicht verlassen. Aber manche lieben das Risiko :zwinker: