Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Wozu dient TList.Delete ?? (https://www.delphipraxis.net/182058-wozu-dient-tlist-delete.html)

silver-moon-2000 26. Sep 2014 14:50

Delphi-Version: XE

Wozu dient TList.Delete ??
 
Hallo zusammen,

ich muss gestehen, ein wenig verwirrt zu sein, nachdem ich in der Hilfe über den folgenden Satz (zu TList.Delete) gestolpert bin:
Zitat:

Note: Delete does not free any memory associated with the item. The object can be freed by overriding the Notify method.
Klar ist also, dass
Delphi-Quellcode:
Delete(Index : Integer)
das Element mit dem Index aus der Liste entfernt, aber NICHT freigibt?

Es gibt ja die folgenden Methoden, die "in etwa" dasselbe machen, nämlich ein Element aus der Liste zu entfernen.
Delphi-Quellcode:
function Extract(Item: TObject): TObject;
function Remove(AObject: TObject): Integer;
procedure Delete(Index: Integer);
Alle drei jedoch geben (nach einem Blick in den SourceCode) das jeweilige Element nicht frei. Das macht natürlich bei Extract Sinn, will man doch das Element weiterverwenden, nur eben nicht mehr in der Liste, sondern getrannt davon verwalten.

Wozu aber Remove und Delete? Beide entfernen das Element aus der Liste, geben es aber nicht frei und geben auch keine Referenz darauf zurück. Meines Verständnisses nach erzeugt man sich doch damit lustig Speicherlecks?

Sieht die Lösung wirklich so aus, dass ich TList.Notiy überschreiben muss?

Delphi-Quellcode:
type TDeletingList<T> = class TList<T>
  protected
    procedure Notify(const Item: T; Action: TCollectionNotification); override;
end;

procedure TDeletingList<T>.Notify(const Item: T; Action: TCollectionNotification);
begin
  if Action = cnRemoved then
    Item.Free
  else
    inherited;
end;
Wenn ich keine Ableitung von TList bzw. TObjectList anlegen will, könnte ich mir alternativ auch so helfen (um das erste Element der List zu löschen), oder:
Delphi-Quellcode:
FList.Extract(FList.Items[0]).Free;
Wenn das so ist, ist für mich die Verwendung dieser Methoden extremst kontra-intuitiv, nämlich, dass die Elemente eben NICHT gelöscht (sondern "nur" aus der Liste entfernt werden).

Zumal ist den oben genannten Hinweis aus der Hilfe auch nicht überall finde: In meiner Hilfe (XE) steht dieser Hinweis nämlich nur in dem Hilfe-Artikel zu "Classes.TList.Delete", nicht aber zu "Generics.Collections.TList.Delete". Gut, dass die Hilfe (zumindest in den ersten XE-Versionen) manchmal nicht hilfreich ist, steht wieder auf einem anderen Blatt.

Einen verwunderten "man-lernt-nie-aus" Gruß in die Runde

Puke 26. Sep 2014 14:57

AW: Wozu dient TList.Delete ??
 
Eigentlich hielt ich dies für selbstverständlich:
TList verwaltet Zeiger und keine Objekte. Delete = Pointer aus der Liste löschen;
TObjectList verwaltet Objekte (schlagt mich bitte nicht!:?). Bedeutet wenn
Delphi-Quellcode:
OwnsObject = true;
, dann Delete = Objekt freigeben und Pointer löschen (Das Objekt gehört ja der Liste, wie der Name schon sagt:thumb:)

Gruß Puke

silver-moon-2000 26. Sep 2014 15:13

AW: Wozu dient TList.Delete ??
 
Zitat:

Zitat von Puke (Beitrag 1273973)
Eigentlich hielt ich dies für selbstverständlich:
TList verwaltet Zeiger und keine Objekte. Delete = Pointer aus der Liste löschen;
TObjectList verwaltet Objekte (schlagt mich bitte nicht!:?). Bedeutet wenn
Delphi-Quellcode:
OwnsObject = true;
, dann Delete = Objekt freigeben und Pointer löschen (Das Objekt gehört ja der Liste, wie der Name schon sagt:thumb:)

Ich fange gleich an, zu heulen. :oops: Du hast ja so Recht. Und ich wieder einmal viel zu kurz geschaut.

Delphi-Quellcode:
procedure TObjectList<T>.Notify(const Value: T; Action: TCollectionNotification);
begin
  inherited;
  if OwnsObjects and (Action = cnRemoved) then
    Value.Free;
end;
TObjectList gibt also wirklich den Wert frei!
Kann mir BITTE mal jemand sagen, wie ich so blöd sein konnte, das zu übersehen?

Ich ziehe somit die Frage zurück und behaupte das Gegenteil. :?

DeddyH 26. Sep 2014 15:18

AW: Wozu dient TList.Delete ??
 
Das ist bei den nicht-generischen Listen übrigens genauso.

p80286 26. Sep 2014 16:13

AW: Wozu dient TList.Delete ??
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1273976)
Kann mir BITTE mal jemand sagen, wie ich so blöd sein konnte, das zu übersehen?

Ach übertreib nicht, du bist nicht der erste und wirst nicht der letzte sein, der darüber stolpert
Allerdings haben DP-Leser jetzt keine Ausrede mehr:
Zitat:

Zitat von Puke (Beitrag 1273973)
TList verwaltet Zeiger und keine Objekte. Delete = Pointer aus der Liste löschen;
TObjectList verwaltet Objekte (schlagt mich bitte nicht!:?). Bedeutet wenn
Delphi-Quellcode:
OwnsObject = true;
, dann Delete = Objekt freigeben und Pointer löschen (Das Objekt gehört ja der Liste, wie der Name schon sagt:thumb:)

Gruß
K-H

Dejan Vu 26. Sep 2014 16:15

AW: Wozu dient TList.Delete ??
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1273976)
Kann mir BITTE mal jemand sagen, wie ich so blöd sein konnte, das zu übersehen?

Ich versuchs mal: Welche Haarfarbe?

silver-moon-2000 26. Sep 2014 16:49

AW: Wozu dient TList.Delete ??
 
Zitat:

Zitat von p80286 (Beitrag 1273993)
Zitat:

Zitat von silver-moon-2000 (Beitrag 1273976)
Kann mir BITTE mal jemand sagen, wie ich so blöd sein konnte, das zu übersehen?

Ach übertreib nicht, du bist nicht der erste und wirst nicht der letzte sein, der darüber stolpert


Ach menno, jetzt darf ich nicht mal mehr in Selbstmitleid zergehen? :duck:

Zitat:

Zitat von Dejan Vu (Beitrag 1273994)
Ich versuchs mal: Welche Haarfarbe?

Braun, wobei die ersten grauen durchkommen, vermutlich vom zu vielen: :gruebel:

Dejan Vu 26. Sep 2014 23:29

AW: Wozu dient TList.Delete ??
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1273998)
Braun, wobei die ersten grauen durchkommen, vermutlich vom zu vielen: :gruebel:

Gefärbt? ;-) Wenn Du 'blond' gesagt hättest, wüsste ich, warum. Aber so: Willkommen im Club. Man wird eben älter. Verstand wird durch Erfahrung ersetzt. Erfahrung ist das, was übrigbleibt, wenn das Gehirn eintrocknet. Glaube ich zumindest. Ich habs vergeseen. Das Alter...

himitsu 27. Sep 2014 10:57

AW: Wozu dient TList.Delete ??
 
Um das nochmal kurz zusammen zu fassen.

Es gibt Listen, welche die Befehle Delete und Remove kennen,
wobei der eine Befehle den Wert löscht und der andere Befehle den Wert entfernt und als Result rausgibt.

Ob beim Löschen nur der Zeiger (Wert) gelöscht wird, oder auch das verlinkte Objekt, hängt vom OwnsObjects ab.



Und das steht eigentlich auch alles in der OH, wenn man die sich mal durchliest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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