Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   IntStringList und Objektfreigabe (https://www.delphipraxis.net/204602-intstringlist-und-objektfreigabe.html)

Shark99 10. Jun 2020 13:21

IntStringList und Objektfreigabe
 
Ich bin dabei eine Klasse von TStringList abzuleiten und zwar eine TIntStrintList, die eine Art Dictionary sein wird.
Delphi-Quellcode:
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;
Ich nutze dabei InsertItem() der StringList, mache aber einen Typecast TObject(i) damit ich direkt einen Integer speichern kann.

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?

himitsu 10. Jun 2020 13:27

AW: IntStringList und Objektfreigabe
 
Delphi-Referenz durchsuchenTStringList.OwnsObjects

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:
https://www.embarcadero.com/products...in-10-4-sydney

TiGü 10. Jun 2020 13:30

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.

Shark99 10. Jun 2020 13:33

AW: IntStringList und Objektfreigabe
 
Danke.

Weil ich ein Delphi 7 Projekt erweitere und es da kein TDictionary gibt.

TurboMagic 10. Jun 2020 20:14

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.

Uwe Raabe 10. Jun 2020 20:42

AW: IntStringList und Objektfreigabe
 
Zitat:

Zitat von Shark99 (Beitrag 1466955)
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?

Genau genommen darfst du die gar nicht freigeben, da es ja keine wirklichen Objekte sind. Du gaukelst das zwar dem Compiler vor, aber real sind das ja wirklich nur Integer. Das könnte sogar hörbar krachen, wenn du die frei gibst.

TiGü 11. Jun 2020 08:56

AW: IntStringList und Objektfreigabe
 
Zitat:

Zitat von TurboMagic (Beitrag 1467020)
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.

Es fällt mir in letzter Zeit auf, dass einige Mitforisten nur noch das Ursprungsposting lesen und gar nicht mehr die schon gegebenen Antworten (auch die des Threaderstellers), in denen schon alles gesagt wurde.

Was ist das? Faulheit? Dummheit? Boshaftigkeit? Oder ein "Ich-will-auch-irgendwas-schreiben"?

dummzeuch 11. Jun 2020 10:06

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.

TurboMagic 11. Jun 2020 10:09

AW: IntStringList und Objektfreigabe
 
Zitat:

Zitat von TiGü (Beitrag 1467038)
Zitat:

Zitat von TurboMagic (Beitrag 1467020)
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.

Es fällt mir in letzter Zeit auf, dass einige Mitforisten nur noch das Ursprungsposting lesen und gar nicht mehr die schon gegebenen Antworten (auch die des Threaderstellers), in denen schon alles gesagt wurde.

Was ist das? Faulheit? Dummheit? Boshaftigkeit? Oder ein "Ich-will-auch-irgendwas-schreiben"?

Nein. Ich hab' einfach vor lauter Beiträge Lesen überlesen, dass der gute ja Integers in dem Platzhalter für Objekte speichern will.
Die darf man natürlich nicht freigeben! Sorry!

himitsu 11. Jun 2020 10:41

AW: IntStringList und Objektfreigabe
 
Zitat:

Zitat von TurboMagic (Beitrag 1467046)
Integers in dem Platzhalter für Objekte speichern will.
Die darf man natürlich nicht freigeben!

Außer er speichert in dem TObject wirklich eine Objektinstanz, :angle:
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 21:35 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz