代码之家  ›  专栏  ›  技术社区  ›  Marek Jedliński

Delphi2009中的通用TList在IndexOf上崩溃

  •  3
  • Marek Jedliński  · 技术社区  · 14 年前

    我在Delphi2009泛型中见过很多关于bug的描述,但从没想过在更新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:Access violation at address 0048974C in module'testbed.exe”。读取地址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几乎完全没有用处。由于更新3似乎没有修复这个bug,除了升级到XE之外,我还有别的办法吗?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Community CDub    8 年前

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

    特别是,试着创建这样的TList

    TList<TTest>.Create(TComparer<TTest>.Default);
    
        2
  •  5
  •   Mason Wheeler    14 年前

    这是默认构造函数中的错误 TObjectList<T> ,我以为在更新3中已经修复了。如果您仍然看到它,请使用不同的构造函数,或者只更新到D2010或XE,在那里它肯定是固定的。(如果你想使用泛型的话,你真的很想摆脱D2009。)