加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi 2009中的Generic TList <>在IndexOf上崩溃

发布时间:2020-12-15 09:09:10 所属栏目:大数据 来源:网络整理
导读:我已经看到许多提到Delphi 2009泛型中的错误,但从来没有预料到在Update 3中会出现如此基本的错误,不会少.如果列表包含一个或多个项目,则在通用TList或TObjectList上调用IndexOf会导致访问冲突: type TTest = class( TObject );procedure DoTest;var list :
我已经看到许多提到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之外,我还有其他办法吗?

解决方法

看看这个问题. Why is TList.Remove() producing an EAccessViolation error?

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读