在调用ReleaseObjectInstanceBlocks
时,我的应用程序在classes.pas(Delphi 2010)的finalization部分的无限循环中被触及。
ReleaseObjectInstanceBlocks
调用GetFreeInstBlockItemCount(InstFreeList, Block)
,问题似乎出现在InstFreeList
链接列表中。该函数遍历该列表,似乎列表指向循环引用(并创建一个无限循环)。
有关如何在此阶段找出导致错误的内容的任何指示? (此时我的所有表格都已被释放了)
我发现问题是Owner
&之间的冲突。 Parent
。我构建了一个表单(我将其用作“框架”,将其放在面板上)使用
constructor TfrSMDControl.Create(AOwner:TComponent; AParent:TWincontrol; id:TStepperMotorDrive);
在运行时创建一些ActiveX组件。
在两个条件下发生崩溃
frSMD := TfrSMDControl.Create(MainForm, Panel1, idControl);
我使用以下析构函数
使用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中的所有权和异常是否存在问题?)
答案 0 :(得分:1)
支持MakeObjectInstance
的共享全局结构已损坏。概率非常接近1,这是因为您的程序破坏了VCL线程模型。程序中的某个地方,您在主线程以外的线程中调用VCL代码。