【问题标题】:TObjectList<T>.Count causes Invalid pointer operationTObjectList<T>.Count 导致无效的指针操作
【发布时间】:2012-03-30 08:15:43
【问题描述】:

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

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

如果我声明 TMyList = class(TList&lt;TMyEntry&gt;); 错误就会消失

我应该避免TObjectList&lt;T&gt; 还是我的代码中的其他内容导致了这个错误?

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;

【问题讨论】:

  • 您应该避免使用 Delphi 2009。该版本中存在大量泛型错误。
  • 这可能是一个 D2009 错误。您的示例适用于 Delphi XE2,但添加后不应释放 Entry,因为 TObjectList 的默认行为是拥有对象。
  • 想一想,这可能是问题所在。不是断言失败,而是“MyList.Free”行对吗?删除带有 Entry.Free 的行(或将 False 作为参数传递给列表构造函数),它应该可以工作。
  • 你看过这个例子吗:Generics Collections TObjectList?
  • 非常感谢 cmets!我发现问题是缺少免费。我的代码中的原始问题没有使用 Count 而是 Contains 并且我发布了一个不好的示例,抱歉。我开了一个新问题stackoverflow.com/questions/9940082/…

标签: delphi generics delphi-2009


【解决方案1】:

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

【讨论】:

  • 实际上,“对象列表”并不意味着所有权(至少对我而言)。 Ant 您可以拥有一个不拥有其对象的对象列表这一事实与您的第一句话相矛盾。
  • 好吧,反过来说,TList 来引入的基本能力。因此,存在普遍的相关性,特别是因为 ownsObjects 参数默认为 true。因此,除非您明确击败它,否则它意味着所有权。
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2012-04-24
  • 2011-01-05
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多