3

Delphi 2009ジェネリックのバグについて多くの言及を見てきましたが、Update3でこれほど基本的なものが失敗するとは思っていませんでした。リストに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にアップグレードする以外の方法はありますか?

4

2 に答える 2

8

この質問を見てください。TList.Remove() が EAccessViolation エラーを生成するのはなぜですか?

特に、このように TList を作成してみてください

TList<TTest>.Create(TComparer<TTest>.Default);
于 2010-11-18T16:09:38.887 に答える
6

これは のデフォルト コンストラクターのバグでありTObjectList<T>、アップデート 3 で修正されたと思います。それでも表示される場合は、別のコンストラクターを使用するか、D2010 または XE にアップデートするだけで、確実に修正されます。(とにかくジェネリックを使いたい場合は、D2009 から降りたいと思うでしょう。)

于 2010-11-18T16:07:29.480 に答える