我已经看到很多提到Delphi 2009泛型中的错误,但是从来没有想到在Update 3中会出现如此基本的错误,不会少。如果列表包含一个或多个项目,则在通用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之外,我还有其他办法吗?
答案 0 :(得分:8)
看看这个问题。 Why is TList.Remove() producing an EAccessViolation error?
特别是,尝试像这样创建你的TList
TList<TTest>.Create(TComparer<TTest>.Default);
答案 1 :(得分:5)
这是TObjectList<T>
的默认构造函数中的一个错误,我认为它已在更新3中修复。如果您仍然看到它,请使用其他构造函数或只更新到D2010或XE,其中它是绝对固定。 (如果你想使用泛型,那么你真的想要脱离D2009。)