zoukankan      html  css  js  c++  java
  • 【MyBean调试笔记】接口的使用和清理

    【DEMO信息】

       有问题的DEMO, 由芒果提交

    【问题描述】

    双击Tab页面关闭页面和插件的时候出现AV异常

       image

    【问题调试】

    我们在调试的时候出现这个错误时断点停在这里

    image

    可以看到停留在这个位置@IntfClear,指针清理的位置

    image

    好我们来调试下这个过程,跟一下是什么时候出现的, 在end 处下个断点后切换到cpu页,我们看到在ret之前调用了一过程,这个地址应该是做一些清理工作后然后返回到调用者地址,

    `TDZCGURW[(RGU7B72)5CNY

    跟进去后,一会就跳到错误的界面,可以说明在清理时出现的,这个时候我们来看看这段代码

    procedure TfrmMain.pgcMainMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Index: Integer;
      lvPluginForm: IPluginForm;
      lvTabShtEx:TTabShtEx;
    begin
      // 左键点击并且双击
      if (Button = mbLeft) and (ssDouble in Shift) then
      begin
        Index := pgcMain.IndexOfTabAt(X, Y);
        if Index >= 0 then
        begin
          lvTabShtEx := TTabShtEx(pgcMain.Pages[Index]);
          lvPluginForm := lvTabShtEx.PluginForm;
          if Application.MessageBox('确认要关闭画面吗?', '询问', MB_OKCANCEL + MB_ICONQUESTION) = IDCANCEL then
            Exit;
          lvPluginForm.freeObject;
          pgcMain.Pages[Index].Free;
        end;
      end;
    end;

    这段代码中有一个lvPluginForm为接口IPluginForm变量, 过程在退出时会执行lvPluginForm := nil和其他一些资源的清理工作,清理的时候会触发对象的__release方法,但是我们看到这个对象已经释放掉了,然后在进行清理的时候出现了上面看到的访问违规的错误。

    【问题解决】

    找到出现问题的根本,解决起来就很快了,尽量不要等到过程清理时在去清理你的资源,特别是可能访问不存在的资源。在end;之前 加一句lvPluginForm := nil;这样就好了

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/DKSoft/p/4093285.html
Copyright © 2011-2022 走看看