FinalizeUnits中的崩溃[Classes.pas的最终化]

时间:2015-02-22 18:39:49

标签: delphi crash

在调用ReleaseObjectInstanceBlocks时,我的应用程序在classes.pas(Delphi 2010)的finalization部分的无限循环中被触及。

ReleaseObjectInstanceBlocks调用GetFreeInstBlockItemCount(InstFreeList, Block),问题似乎出现在InstFreeList链接列表中。该函数遍历该列表,似乎列表指向循环引用(并创建一个无限循环)。

有关如何在此阶段找出导致错误的内容的任何指示? (此时我的所有表格都已被释放了)

更新&更多细节

我发现问题是Owner&之间的冲突。 Parent。我构建了一个表单(我将其用作“框架”,将其放在面板上)使用  constructor TfrSMDControl.Create(AOwner:TComponent; AParent:TWincontrol; id:TStepperMotorDrive);在运行时创建一些ActiveX组件。

在两个条件下发生崩溃

  1. 如果使用不同的所有者和父级创建框架。例如,frSMD := TfrSMDControl.Create(MainForm, Panel1, idControl);
  2. 析构函数代码中发生异常(在这种情况下,Delphi会尝试第二次释放此对象 - 即使使用try除了块来捕获错误)。
  3. 我使用以下析构函数

    使用FreeAndNil(frSMD)释放对象

    try CWDIO.Free; CWPulse.Free; CWDAQTools.Free; except on e:exception do MyDBG.LogException(E.Message); end;

    如果使用frSMD := TfrSMDControl.Create(nil, Panel1, idControl);(使用相同的析构函数异常处理代码)创建框架,则不会发生崩溃。

    CWxxx都是Ole / ActiveX组件。 Delphi如何处理OleControls中的所有权和异常是否存在问题?)

1 个答案:

答案 0 :(得分:1)

支持MakeObjectInstance的共享全局结构已损坏。概率非常接近1,这是因为您的程序破坏了VCL线程模型。程序中的某个地方,您在主线程以外的线程中调用VCL代码。