![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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