通用 TList<> Delphi 2009 在 IndexOf 上崩溃

发布于 2024-10-03 08:21:34 字数 962 浏览 9 评论 0 原文

我已经看到很多关于 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之外我还有其他办法吗?

I've seen many mentions of bugs in Delphi 2009 generics, but never expected something so basic to fail in Update 3, no less. Calling IndexOf on a generic TList or TObjectList causes an access violation if the list contains 1 or more items:

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;

The exception is "EAccessViolation: Access violation at address 0048974C in module 'testbed.exe'. Read of address 00000000"

Compiling with debug DCUs leads to a problem in generics.collections.pas - the FComparer member is not assigned:

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;

This of course makes the generic TList almost completely useless. Since Update 3 does not seem to have fixed this bug, do I have a recourse other than upgrading to XE?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

停滞 2024-10-10 08:21:34

看看这个问题。 为什么 TList.Remove() 会产生 EAccessViolation 错误?

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

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

Have a look at this question. Why is TList.Remove() producing an EAccessViolation error?

In particular, try creating your TList like this

TList<TTest>.Create(TComparer<TTest>.Default);
笑着哭最痛 2024-10-10 08:21:34

这是 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.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文