gpt4 book ai didi

delphi - FinalizeUnits 崩溃 [Classes.pas 的最终确定]

转载 作者:行者123 更新时间:2023-12-02 03:36:33 24 4
gpt4 key购买 nike

调用 ReleaseObjectInstanceBlocks 时,我的应用程序在classes.pas (Delphi 2010) 的终结部分陷入无限循环。

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

有任何关于如何找出现阶段导致错误的原因的指示吗? (显然,此时我的所有表单都已被释放)

更新和更多详细信息

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

在两个条件下都会发生崩溃

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

我使用以下析构函数通过 FreeAndNil(frSMD) 释放对象

尝试一下
CWDIO.免费;
CWPulse.免费;
CWDAQTools.免费;
除了 e:exception 之外
MyDBG.LogException(E.Message);
结尾;

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

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

最佳答案

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

关于delphi - FinalizeUnits 崩溃 [Classes.pas 的最终确定],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com