delphi - TObjectList<T>.Count 导致无效的指针操作

标签 delphi generics delphi-2009

在 Delphi 2009 中,到目前为止,我在泛型方面没有遇到任何重大问题(使用 Generics.Collections 列表,没有特殊的泛型功能)。

现在我发现这段代码会在访问 MyList.Count 的行中导致“无效指针操作” 。 (MyList.Contains 和 MyList.IndexOf 会导致相同的错误)。

如果我声明 TMyList = class(TList<TMyEntry>),错误就会消失;

我应该避免 TObjectList<T>或者我的代码中的其他内容导致了此错误?

type
  TMyEntry = class(TStringlist);
  TMyList = class(TObjectList<TMyEntry>);

procedure TListTests.TestAV;
var
  Entry: TMyEntry;
  MyList: TMyList;
begin
  MyList := TMyList.Create;
  try
    Entry := TMyEntry.Create;
    try
      MyList.Add(Entry);
      Assert(MyList.Count = 1);  // <--- fails
    finally
      Entry.Free;
    end;
  finally
    MyList.Free;
  end;
end;

最佳答案

TObjectList 命名为 Object 列表,因为它拥有它存储的对象。所以你不必释放列表中包含你自己的对象。 TObjectList 为您做这件事。 我已经在 Delphi2010 中测试了您的示例代码。我在 MyList.free() 行中获得了 AV。原因是您执行了Entry.Free。 List 不知道这一点,并尝试再次释放对象。 TObjectList的构造函数有 bool 参数ownsObjects(默认= true),您可以使用它和它手动包含的免费对象。

关于delphi - TObjectList<T>.Count 导致无效的指针操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9939277/

相关文章:

multithreading - 日志记录和同步

linux - 有没有人知道即将推出的 Delphi 版本中的 Linux 支持信息?

Delphi MapiSendMail 在 Windows 7 64 位上崩溃

delphi - 如何使用 JEDI TJCLHashMap 类?

代码片段的 Java 泛型说明

delphi - Delphi 2009 中的 dfm 中添加的 DoubleBuffered 属性在 Delphi 2007 中不存在

Delphi:数学表达式

java - 如何使用泛型进行 instanceof 和类型转换

java - 是否有 Eclipse 交互式调试工具来评估类型属性?

multithreading - OpenDialog 没有出现在 Delphi 多线程应用程序中