Domanda

Ho visto molte menzioni di bug in Delphi 2009 farmaci generici, ma mai aspettato qualcosa di così fondamentale per riuscire a Update 3, niente di meno. Chiamata IndexOf su un TList generica o TObjectList causa una violazione di accesso se l'elenco contiene 1 o più elementi:

type
  TTest = class( TObject );

procedure DoTest;
var
  list : TObjectList< TTest >;
  t : TTest;
begin
  list := TObjectList< TTest >.Create;
  try
    t := TTest.Create;
    list.IndexOf( t ); // No items in list, correct result -1
    list.Add( t );
    list.IndexOf( t ); // Access violation here
  finally
    list.Free;
  end;
end;

L'eccezione è "EAccessViolation: Violazione di accesso all'indirizzo 0048974C nel modulo 'testbed.exe' Leggi di indirizzo 00000000".

La compilazione con il debug DCU porta ad un problema in generics.collections.pas - Stati FComparer è non assegnato:

function TList<T>.IndexOf(const Value: T): Integer;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do
    if FComparer.Compare(FItems[i], Value) = 0 then
      Exit(i);
  Result := -1;
end;

Questo naturalmente rende la generica TList quasi del tutto inutile. Dal Update 3 non sembra aver risolto questo bug, devo un ricorso diverso aggiornamento a XE?

È stato utile?

Soluzione

Date un'occhiata a questa domanda. Perché TList.Remove () produce un errore EAccessViolation?

In particolare, provare a creare il tuo TList come questo

TList<TTest>.Create(TComparer<TTest>.Default);

Altri suggerimenti

Questo è un bug nel costruttore di default di TObjectList<T>, e ho pensato che è stato fissato in aggiornamento 3. Se si sta ancora vederlo, utilizzare un costruttore diverso o semplicemente aggiornare per D2010 o XE, dove è definitivamente risolto. (E ti davvero vuole scendere di D2009, se si vuole lavorare con i generici comunque.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top