我见过许多德尔福提到的bug 2009年仿制药,但万万没有想到的东西,所以基本都在更新3失败,不会少。在通用或的TList调用TObjectList的IndexOf导致访问冲突如果列表中包含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:访问冲突在模块 'testbed.exe' 读取地址00000000的地址0048974C”。

在generics.collections.pas具有调试的DCU引线编译到一个问题 - 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?

有帮助吗?

解决方案

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

在特定的,尝试创建你从TList这样

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

其他提示

这是在TObjectList<T>的默认构造函数中的错误,我想它是固定在更新3.如果您仍能看到它,使用不同的构造函数,或只是更新到D2010或XE,它是绝对固定的。 (你会真的想,如果你想使用泛型反正工作让D2009的了。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top