Einzelnen Beitrag anzeigen

SteffenSchm

Registriert seit: 2. Nov 2004
Ort: Herzogenaurach
84 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Remove in Generic TObjectList

  Alt 23. Jul 2009, 14:47
Nach längerer Zeit hat mich dieser Punkt wieder einmal geärgert. Ich habe das Thema in QualityCentral eingestellt (#75853) und einen Verweis auf ein bereits diskutiertes Thema bekommen (#67272) - dort war auch der Grund für die Fehlermeldung und eine Abhilfe zu finden. Falls es jemand interessiert, dann versuche ich es mal mit meinen Worten zu beschreiben:

Der Fehler liegt in der Unit Generics.Collections im Constructor von TObjectList<T>:
Delphi-Quellcode:
constructor TObjectList<T>.Create(AOwnsObjects: Boolean);
begin
  inherited;
  FOwnsObjects := AOwnsObjects;
end;
TObjectList<T> ist von TList<T> abgeleitet. In der Klasse TList<T> gibt es aber keinen Constructor mit einem Parameter AOwnsObject. Damit läuft der Aufruf inherited ins Leere (und erzeugt auch keinen Compiler-Fehler !). Das heisst TObjectList wird nicht initialsiert und es wird kein auch keine Comparer erzeugt (dies geschieht eigentlich in TList.Create). Damit erzeugen alle nachfolgenden Aufrufe wie etwa
Delphi-Quellcode:
ObjectList.Extract(Obj)
ObjectList.Remove(Obj)
ObjectList.IndexOf(Obj)
eine AV.

Lösungen:

- Korrektur in Generics.Collections.pas:
Delphi-Quellcode:
constructor TObjectList<T>.Create(AOwnsObjects: Boolean);
begin
  inherited Create();
  FOwnsObjects := AOwnsObjects;
end;
oder
- Meiden des Aufrufs
  ObjectList := TObjectList<TNewObject>.Create; stattdessen:
  ObjectList := TObjectList<TNewObject>.Create(TComparer<TNewObject>.Default); Wie schon gesagt, die Lösung kommt nicht von mir, sondern wurde von Anfrey Tsiruljov und Wang Rui (die ich hier zumindest erwähnen möchte) in QualityCentral gestellt.
Mich wundert nur, dass der Fehler nicht in einem Delphi Update behoben wurde, da diese Fehler-Reports schon einige Monate alt sind.
Steffen
  Mit Zitat antworten Zitat