Was ich in deinem Code noch vermisse ist die Freigabe des Png48 Objekts. Wenn TIconData freigegeben wird, muss auch das Png48 freigegeben werden, sonst hagelt es von Memoryleaks. Überschreibe dafür den Destroy Destructor in TIconData:
Delphi-Quellcode:
type
TIconData = class(TObject)
public
IconID : integer;
Png48 : TObject;
destructor Destroy(); override;
end;
TIconList = TObjectList<TIconData>;
{ TIconData }
destructor TIconData.Destroy;
begin
Png48.Free;
inherited;
end;