3

我在 Delphi 2009 泛型中看到了很多关于 bug 的提及,但从没想到在更新 3 中如此基本的东西会失败,至少如此。如果列表包含 1 个或多个项目,则对通用 TList 或 TObjectList 调用 IndexOf 会导致访问冲突:

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:模块'testbed.exe'中地址0048974C的访问冲突。读取地址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 几乎完全无用。由于 Update 3 似乎没有修复这个错误,我除了升级到 XE 之外还有其他办法吗?

4

2 回答 2

8

看看这个问题。为什么 TList.Remove() 会产生 EAccessViolation 错误?

特别是,尝试像这样创建您的 TList

TList<TTest>.Create(TComparer<TTest>.Default);
于 2010-11-18T16:09:38.887 回答
6

这是 的默认构造函数中的一个错误TObjectList<T>,我认为它已在更新 3 中修复。如果您仍然看到它,请使用不同的构造函数或只是更新到 D2010 或 XE,它肯定已修复。(如果你想使用泛型,你真的很想离开 D2009。)

于 2010-11-18T16:07:29.480 回答