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