Autor Beitrag
rushifell
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Mi 18.04.18 17:56 
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.

ausblenden 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;


ausblenden 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);


ausblenden 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.04.18 18:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: rushifell, Symbroson
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Do 19.04.18 06: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.04.18 09: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.

Für diesen Beitrag haben gedankt: Narses
rushifell Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 306
Erhaltene Danke: 14



BeitragVerfasst: Do 19.04.18 12: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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 19.04.18 14:17 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18730
Erhaltene Danke: 1630

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 20.04.18 08: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.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 20.04.18 10:54 
- Nachträglich durch die Entwickler-Ecke gelöscht -
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6330
Erhaltene Danke: 134

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Fr 20.04.18 11: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: