在 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/