我有一个的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]导致EListError为$ someAddress,而评估fMgr.Windws [0],而不是 - 返回正确的结果...

什么是更奇怪,即使是EListError,函数返回正确的数据...并没有显示任何东西。在关闭两次EListError内存泄漏只是信息(使用FastMM)

任何想法可能是错了吗?!

由于预先 米甲

有帮助吗?

解决方案

我觉得你只是混淆了某种方式的调试器。有时候,“干净”的,无泄漏的代码似乎产生了内存泄漏,如果有一个手表看属性,和评价表导致异常。这些不显示向它们被调试处理的IDE。

其中这可能发生的情况是,如果你有表示fMgr.Windows [AIndex] Aindex被intialised之前,或者在fMgr.Windows手表中的调试器[0]之前有列表中的任何项目。

其他提示

没有理由为它抛出EListError如果索引是正确的。如果抛出一个异常,也没有理由为它无法显示,还是回到正常的结果。

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

也许您在多线程的问题?也许不会例外抛出,但调试器不在断点停止?也许泄漏是不是从这个代码?也许这是一个假泄漏报告?也许fMgr引用不同的东西?也许事实不同?

您可以尝试开启更多的调试信息,并FastMM报告调用堆栈或者你可以尝试与调试的DCU和跟踪编译成从TList代码。并确保德尔福停止在所有异常。也许,这将有助于找到你的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top