0

我有一个存储一些对象的 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 ......但是,如果我对其进行硬编码(例如,将 AIndex 替换为值 0 或 1)它可以正常工作。我尝试调试它,该函数被调用了两次,参数为 0 和 1(如预期的那样)。

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

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

有什么想法可能是错的吗?!

在此先感谢

4

2 回答 2

1

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

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

于 2009-12-28T06:45:47.077 回答
0

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

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

也许您遇到多线程问题?也许异常确实被抛出,但调试器不会在断点处停止?也许泄漏不是来自这段代码?也许这是一个虚假的泄漏报告?也许 fMgr 引用了不同的东西?也许事实不同?

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

于 2009-12-27T18:07:34.987 回答