TObjectList <t> .Count导致无效指针操作</t>

时间:2012-03-30 08:15:44

标签: delphi generics delphi-2009

在Delphi 2009中,到目前为止我没有遇到Generics的主要问题(使用Generics.Collections列表,没有特殊的Generics功能)。

现在我发现这段代码会在访问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;

1 个答案:

答案 0 :(得分:2)

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