AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FreeMem vs. Dispose bei TList of Record

Ein Thema von Bjoerk · begonnen am 6. Sep 2011 · letzter Beitrag vom 6. Sep 2011
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

FreeMem vs. Dispose bei TList of Record

  Alt 6. Sep 2011, 18:06
Delphi-Version: 2007
Ich habe eine TList, mit der ich Dateien miteinander vergleichen möchte.

Items werden so hinzugefügt:
Delphi-Quellcode:
type
  TItem = record
    FileName: string;
    FileSize: integer;
    FileMem: Pointer;
  end;

procedure TItemList.AddItem(Item: TItem);
var
  P: PItem;
begin
  New(P); // ***
  P^:= Item;
  Add(P);
end;
Die Dateien werden so eingelesen:

Delphi-Quellcode:
procedure TForm1.getFiles(const Path, Mask: string);
var
  SearchRec: TSearchRec;
  Result, R: integer;
  Item: TItem;
  F: File;
begin
  Result:= findFirst(Path+Mask, faArchive, SearchRec);
  while Result = 0 do
  begin
    Item.FileName:= Path+SearchRec.Name;
    Item.FileSize:= SearchRec.Size;

    AssignFile(F, Item.FileName);
    GetMem(Item.FileMem, Item.FileSize); // ***
    Reset(F, 1);
    BlockRead(F, Item.FileMem^, Item.FileSize, R);
    CloseFile(F);

    ItemList.AddItem(Item);
    Result:= findNext(SearchRec);
  end;
  findclose(SearchRec);
end;
Verglichen werden die Dateien anschließend mit CompareMem.

Die Liste wird so gelöscht:
Delphi-Quellcode:
procedure TItemList.DelItem(Index: integer);
var
  P: PItem;
begin
  P:= Items[Index];
  FreeMem(P.FileMem); // ***
  Dispose(P); // ***
  Delete(Index);
end;

procedure TItemList.ClearList;
begin
  while Count > 0 do DelItem(Count-1);
end;
Meine Frage ist jetzt, ob das FreeMem in DelItem Blödsinn ist, oder muß mit GetMem angeforderter Speicher auf jeden Fall mit FreeMem freigegeben werden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#2

AW: FreeMem vs. Dispose bei TList of Record

  Alt 6. Sep 2011, 19:02
Natürlich mußt du diesen Speicher auch wieder freigeben, ABER

- mit Delphi-Referenz durchsuchenNew reserviert = mit Delphi-Referenz durchsuchenDispose freigeben
- mit Delphi-Referenz durchsuchenGetMem reserviert = mit Delphi-Referenz durchsuchenFreeMem freigeben
- mit Delphi-Referenz durchsuchenCreate reserviert = mit Delphi-Referenz durchsuchenFree freigeben
usw.
New + FreeMem paßt allerdings nicht zusammen

PS: Deswegen wurde dir ja auch mal TObjectList+Datenobjekt vorgeschlagen, denn der TObjectList kann man sagen, daß sie Owner (Besitzer) der Objekte ist, mit dem Ergebnis, daß die Objektliste sich um das Freigeben kümmert.

Ab D2009 gibt es dann noch die generische TList<>, welche sich um die Verwaltung ihres enthaltenden Datentyps kümmert.
(TList<TMyRecord> hat quasi das New und Dispose schon eingebaut)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: FreeMem vs. Dispose bei TList of Record

  Alt 6. Sep 2011, 19:34
Jenachdem was der Dateivergleich leisten soll, braucht man unterschiedliche Strategien.
Wenn zwei Dateien unterschiedliche Längen haben, dann können sie nicht gleich sein.
Dies sollte man ganz zu Beginn prüfen, bevor man unnötigerweise eine oder mehrere Dateien eingelesen hat.

Möchte man einfach nur zwei Dateien vergleichen, dann sollte man diese blockweise (z.B. 4kByte) einlesen und bei einem Unterschied kann sofort abgebrochen werden.
Das ist ein Riesenvorteil wenn man z.B. zwei Dateien mit jeweils 3 GByte vergleichen möchte und schon nach 16 kByte ein Unterschied aufgetreten ist.

Möchte man dagegen Duplikate finden und dazu jede Datei mit jeder anderen vergleichen,
dann ist es auch nicht ratsam sämtliche Dateien in den Hautpspeicher zu laden.
Stattdessen bildet man eine Prüfsumme (z.B. MD5, SHA-320,...) über alle Dateien und vergleicht nur die Prüfsummen.
Das spart enorm viel Speicher.
Andreas
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: FreeMem vs. Dispose bei TList of Record

  Alt 6. Sep 2011, 19:40

PS: Deswegen wurde dir ja auch mal TObjectList+Datenobjekt vorgeschlagen [..]
Ähm, wann ? Von wem ?

Ich danke dir für die Antwort. Müßte bei einer ObjectList (in diesem Fall) nicht auch GetMem/FreeMem erfolgen ??
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 Beiträge
 
Delphi 12 Athens
 
#5

AW: FreeMem vs. Dispose bei TList of Record

  Alt 6. Sep 2011, 20:16
In einer TObjectList legt man ja überlicher Weise Objekte ab
- die erstellt man einmal mit Create und gibt sie mit Free frei
- steht OwnsObjects auf True, dann ruft die Objektliste das Free auf, wenn ein Item gelöscht wird


Wo *überleg* ... in 'nem anderem Thread, aber jetzt wo du's sagst ... ich glaub ich hab dich verwechselt [SIZE="p"](passten wohl zu gut zusammen, die beiden Themen )[/SIZE]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.
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