发生奇怪的EListError(访问变量定义的索引时)

时间:2009-12-27 12:35:37

标签: delphi tlist

我有一个TList存储一些对象。现在我有一个函数在该列表上执行一些操作:

function SomeFunct(const AIndex: integer): IInterface
begin
if (AIndex > -1) and (AIndex < fMgr.Windows.Count ) then
  begin
    if (fMgr.Windows[AIndex] <> nil) then
      begin
        if not Supports(TForm(fMgr.Windows[AIndex]), IMyFormInterface, result) then
          result:= nil;
      end;
  end
else
  result:= nil;
end;

现在,真正奇怪的是,使用任何正确的索引访问fMgr.Windows会导致EListError ...但是如果我对其进行硬编码(例如,将值为0或1替换为AIndex)它工作正常。 我尝试调试它,函数被调用两次,参数为0和1(假设)。

当AIndex = 0时,评估fMgr.Windows [AIndex]导致$ someAddress的EListError,而评估fMgr.Windws [0]则返回正确的结果......

更奇怪的是,即使存在EListError,该函数也会返回正确的数据......并且不会显示任何内容。关于关闭时使用两个EListError内存泄漏的信息(使用FastMM)

任何想法可能出错?!

提前致谢 米甲

2 个答案:

答案 0 :(得分:1)

我认为你只是以某种方式混淆了调试器。有时“干净”,无泄漏的代码似乎会在手表查看属性时产生内存泄漏,并且评估该手表会导致异常。它们不会显示给IDE,它们由调试器处理。

可能发生这种情况的情况是,如果你有一个调试器在Aindex初始化之前显示fMgr.Windows [AIndex],或者在列表中有任何项目之前在fMgr.Windows [0]上监视。

答案 1 :(得分:0)

如果索引正确,则没有理由抛出EListError。如果抛出异常,则没有理由不显示并仍然返回正常结果。

不幸的是,很难看出这个小信息的问题是什么,所以我只能猜测:

也许你有多线程问题?也许抛出异常,但调试器不会在断点上停止?也许泄漏不是来自这个代码?也许这是一个错误的泄漏报告?也许fMgr引用了不同的东西?也许事实不同?

您可以尝试打开更多调试信息并使用FastMM报告调用堆栈,或者您可以尝试使用调试DCU进行编译并跟踪到TList代码。并确保Delphi停止所有异常。也许这有助于找到你的问题。