通用 TList<> Delphi 2009 在 IndexOf 上崩溃
我已经看到很多关于 Delphi 2009 泛型中错误的提及,但从未预料到如此基本的东西会在 Update 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之外我还有其他办法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看看这个问题。 为什么 TList.Remove() 会产生 EAccessViolation 错误?
特别是,尝试像这样创建 TList
Have a look at this question. Why is TList.Remove() producing an EAccessViolation error?
In particular, try creating your TList like this
这是
TObjectList
的默认构造函数中的一个错误,我认为它已在更新 3 中修复。如果您仍然看到它,请使用不同的构造函数或仅更新到 D2010 或 XE ,它肯定是固定的。 (如果您无论如何都想使用泛型,您真的会想摆脱 D2009。)This is a bug in the default constructor of
TObjectList<T>
, and I thought it was fixed in update 3. If you're still seeing it, use a different constructor or just update to D2010 or XE, where it's definitely fixed. (And you'll really want to get off of D2009 if you want to work with generics anyway.)