Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Korrekte Objekt - Freigabe?

  Alt 5. Dez 2020, 22:10
Wenn ich deinen Code jetzt richtig deute - mir fehlen da ggf. noch ein paar Informationen zu den verwendeten Klasse - dann ist es so, dass du beim Hinzufügen der Elemente aus dem Array zur TObjectList<T> die TObjectList<T> zum Besitzer der Elemente machst. Durch das Hinzufügen wird nur ein Pointer auf das Objekt in die ObjectList eingefügt die zuvor auch im TArray verwendet wurde. Wenn die ObjectList mit OwnsObjects = True erzeugt wurde, was dem Standard entspricht, dann werden die Objekte auch entsprechend freigegeben.
Die Elemente werden nicht einer ObjectList, sondern ebenfalls einem Array hinzugefügt:
Delphi-Quellcode:
  TPaging<TItem: class> = class
  private
    FItems: TArray<TItem>; // enthält die Track-Objekte; hierhin wird kopiert
    FOffset: Integer;
    FTotal: Integer;
    FLimit: Integer;
    FHref: string;
    FNext: string;
    FPrevious: string;
    function ExpandItems(NewLength: Integer):Integer;
    function AddItem(Item: TItem; var Position: Integer): Boolean;
    Function GetTrackcount: Integer;
  public
    destructor Destroy; override;
    property Href: string read FHref;
    property Items: TArray<TItem> read FItems;
    property Limit: Integer read FLimit;
    property Next: string read FNext;
    property Offset: Integer read FOffset;
    property Previous: string read FPrevious;
    property Total: Integer read FTotal;
    property count: Integer read GetTrackCount;
  end;

  TPlayList = class
  private
    FName: string;
    FTracks: TPaging<TPlaylistTrack>;
  public
    destructor Destroy; override;
    property Name: string read FName;
    property Tracks: TPaging<TPlaylistTrack> read FTracks;
  end;
Bei ersten Versuchen hatte ich beim Freigeben von 'nextpage' auch die Elemente des Arrays entsorgt. Das hatte prompt zur Folge, dass die kopierten Zeiger im Playlist-Objekt ins Nirwana zeigten und Accessviolations erzeugten. In der aktuellen Version werden alle Items, auch die hinzugefügten, erst zusammen mit dem Playlist-Objekt freigegeben. Jedenfalls bleiben keine 'Speicherleichen' zurück (ReportMemoryLeaksOnShutdown = true)

Gruß LP
  Mit Zitat antworten Zitat