通用的TList <>中的Delphi 2009碰撞上的IndexOf
-
26-09-2019 - |
题
我见过许多德尔福提到的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的了。)
不隶属于 StackOverflow