![]() |
IntStringList und Objektfreigabe
Ich bin dabei eine Klasse von TStringList abzuleiten und zwar eine TIntStrintList, die eine Art Dictionary sein wird.
Delphi-Quellcode:
Ich nutze dabei InsertItem() der StringList, mache aber einen Typecast TObject(i) damit ich direkt einen Integer speichern kann.
type
TIntStringList = class(TStringList) public function AddInteger(const s: string; i: integer): Integer; function GetInteger(const s: string; var i: integer): boolean; end; implementation function TIntStringList.AddInteger(const s: string; i: integer): Integer; begin if not Sorted then Result := Count else // sorted if Find(S, Result) then // if not found Result is 0 if Duplicates = dupIgnore then Exit; InsertItem(Result, S, TObject(i)); end; function TIntStringList.GetInteger(const s: string; var i: integer): boolean; begin Result := False; i := IndexOf(s); if i > - 1 then begin i := Integer(Objects[i]); Result := True; end; end; Meine Frage ist ob ich die Integers die in Objects[] gespeichert werden vor dem .Free einer Instanz so Liste einzeln manuell freigeben muss, damit kein Speicherleck entsteht? |
AW: IntStringList und Objektfreigabe
![]() In den alten NextGen-Compilern (Android/iOS) würde dein Code knallen, da dort Objekte wie Interfaces referenzgezählt sind, aber dein "Objekt" ja Keines ist. Was ich jetzt genau bezüglich dem "unified memory management" im Windows und NextGen geändert hat, da hatte ich noch keine Zeit mir einen Überblick zu verschaffen ... nicht dass es dort nun auch knallen könnte. :stupid: ![]() |
AW: IntStringList und Objektfreigabe
1. Waaaas? :shock:
2. Warum nimmst du kein richtiges TDictionary, welches seit Delphi 2009 mit dabei ist? 3. Warum willst du einen Integer freigeben? Der Cast auf TObject ist nur ein Cast, es entsteht keine wirkliche Instanz auf dem Heap. Ergo muss da auch nichts freigeben werden. |
AW: IntStringList und Objektfreigabe
Danke.
Weil ich ein Delphi 7 Projekt erweitere und es da kein TDictionary gibt. |
AW: IntStringList und Objektfreigabe
Beantwortung der Originalfrage: ja, die müssen freigegeben werden.
Wärst du auf neueren Delphi Versionen könntest du ReportMemoryLeaksOnShutdown := true; als erste Zeile der dpr setzen und würdest Memoryleaks dann beim Programmende angezeigt bekommen. Und TDictionary aus Generics.Collections wäre auch sicher eine einfache und brauchbare Lösung für deine Problemstellung. |
AW: IntStringList und Objektfreigabe
Zitat:
|
AW: IntStringList und Objektfreigabe
Zitat:
Was ist das? Faulheit? Dummheit? Boshaftigkeit? Oder ein "Ich-will-auch-irgendwas-schreiben"? |
AW: IntStringList und Objektfreigabe
Eigentlich hat Uwe die Frage ja schon beantwortet, aber da gerade eine falsche Antwort kam:
(Dies gilt für Delphi 7 und alle neueren Versionen für den 32 Bit Windows Compiler) TObject(IntegerVariable) ist lediglich ein Typecast, es erzeugt kein Objekt und deshalb darf auch keines freigegeben werden. Ich hätte dort allerdings nicht nach TObject sondern nach Pointer gecastet. Und da TStringList die Objekte nicht selbst verwaltet, sondern nur die Pointer speichert, besteht auch keine Gefahr, dass irgendwo in der RTL versucht wird die (Pseudo-)Objekte freizugeben. Also alles gut. |
AW: IntStringList und Objektfreigabe
Zitat:
Die darf man natürlich nicht freigeben! Sorry! |
AW: IntStringList und Objektfreigabe
Zitat:
wo dann das OwnsObjects=True liebendgern die Freigabe übernehmen würde.
Delphi-Quellcode:
type
TMyDataObject = class FValue: Integer constructor Create(Value: Integer); end; function TIntStringList.AddInteger(const s: string; i: integer): Integer; begin ... //InsertItem(Result, S, TObject(i)); InsertItem(Result, S, TMyDataObject.Create(i)); end; |
AW: IntStringList und Objektfreigabe
Kurze Klarstellung bzgl TDictionary: Das hier ähnelt wohl eher einer TList<TPair<String, Integer>> als einem TDictionary<String, Integer>, denn es können ja Duplikate im Schlüssel vorkommen.
Die Frage, wieso man Abwärtskompatibilität bis runter nach Delphi 7 bewahren muss stell ich an dieser Stelle mal auch besser nicht, denn erstens ist Delphi 7 mittlerweile so gut wie gar nicht mehr im Gebrauch, und zweitens benötigt man ja kein Delphi 10 nur um dann mit Delphi 7 Features entwickeln zu dürfen. Aber sei's drum... Es stellt sich mit dennoch die Frage, wieso hier die TStringList so enorm Zweckentfremdet wird, dafür Kann man sich ja eigentlich ziemlich schnell etwas vernünftiges bauen. Problem ist nämlich, genau wie beschrieben, dass es bei falscher Anwendung oder ARC-Compilern schnell am krachen tun ist. (Was passiert wenn ich aus Versehen die OwnsObjects-Eigenschaft benutze?) |
AW: IntStringList und Objektfreigabe
Zitat:
Zitat:
|
AW: IntStringList und Objektfreigabe
Das Projekt hat 80.000 Zeilen Code. Es von Delphi 7 auf 10.4 hochzuziehen würde sicher zu einem Umschreiben von 10% des Code resultieren. Es werden auch mindestens 20 Komponenten verwendet die mit Delphi XE1+ gar nicht funktionieren und ersetzt werden müssten. Dazu würde sich die Exe Größe durch den Umstieg sicher verdreifachen. Ein Fenster mit einem Button hat in Delphi 10 schon eine riesige Größe in Vergleich zu Delphi 7.
|
AW: IntStringList und Objektfreigabe
Zitat:
|
AW: IntStringList und Objektfreigabe
Zitat:
Grüße Dalai |
AW: IntStringList und Objektfreigabe
Zitat:
|
AW: IntStringList und Objektfreigabe
Ups, hab ich offenbar verwechselt. Sorry.
Grüße Dalai |
AW: IntStringList und Objektfreigabe
Zitat:
Ist vielleicht nicht ganz im Sinne des Erfinders, aber geht glaube ich schon. |
AW: IntStringList und Objektfreigabe
mit .Sorted := True sind auch bei TIntStingList keine Duplikate erlaubt.
|
AW: IntStringList und Objektfreigabe
Nicht ganz: um Duplicates auf dupIgnore setzen zu können, muss außerdem Sorted auf true gesetzt sein, so wird ein Schuh draus.
|
AW: IntStringList und Objektfreigabe
Zitat:
|
AW: IntStringList und Objektfreigabe
Es geht darum, dass Delphi 7 extrem populär war und dafür tausende Komponenten entwickelt wurden, die dann nicht nach Delphi 2007/2009/XE konvertiert wurden. Da Delphi 2007 und 2009 dazu noch beim Release extrem buggy waren sind viele Projekte bei Delphi 7 steckengeblieben und werden bis heute gepflegt.
Ich nutze neben Delphi 7 vor allem Delphi XE5, und die UI von Delphi 7 fühlt sich sensationell schnell an. Die Suchfunktion ist auch leichter zu beutzen. Bleibt man bei Win32 gibt es dank CNPack und GExperts bis auf 64bit Unterstützung kaum Nachteile zu Delphi XE. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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