Общий TList <> в Delphi 2009 аварийно завершает работу на IndexOf - PullRequest
3 голосов
/ 18 ноября 2010

Я видел много упоминаний об ошибках в дженериках Delphi 2009, но никогда не ожидал, что что-то настолько простое в обновлении 3, не меньше.Вызов IndexOf для универсального TList или TObjectList вызывает нарушение прав доступа, если список содержит 1 или более элементов:

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;

Исключение составляет «EAccessViolation: нарушение прав доступа по адресу 0048974C в модуле« testbed.exe ». Читатьадреса 00000000 "

Компиляция с отладочными DCU приводит к проблеме в generics.collections.pas - члену FComparer не назначен:

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;

Это, конечно, делает универсальный TList почти полностьюбесполезный.Поскольку обновление 3, по-видимому, не исправило эту ошибку, есть ли у меня другие возможности, кроме обновления до XE?

Ответы [ 2 ]

8 голосов
/ 18 ноября 2010

Посмотрите на этот вопрос. Почему TList.Remove () выдает ошибку EAccessViolation?

В частности, попробуйте создать свой TList следующим образом

TList<TTest>.Create(TComparer<TTest>.Default);
5 голосов
/ 18 ноября 2010

Это ошибка в конструкторе по умолчанию TObjectList<T>, и я подумал, что это исправлено в обновлении 3. Если вы все еще видите его, используйте другой конструктор или просто обновите D2010 или XE, где он определенно исправлен. , (И вы действительно захотите отказаться от D2009, если вы все равно хотите работать с генериками.)

...