delphi中的不安全强制转换有时仅在某些机器上给出零?
我们有一些类似这样的代码(Delphi 6 RTL更新包3): Tchild1通过2+层次结构级别从TGrandPa继承 function1的定义如下,其中objChildData是TProcessor类的私有变量,类型为TChild1:delphi中的不安全强制转换有时仅在某些机器上给出零?,delphi,casting,delphi-6,Delphi,Casting,Delphi 6,我们有一些类似这样的代码(Delphi 6 RTL更新包3): Tchild1通过2+层次结构级别从TGrandPa继承 function1的定义如下,其中objChildData是TProcessor类的私有变量,类型为TChild1: TProcessor.function1(objTemp : TGrandPa):boolean; begin objChildData := TChild1(objTemp); .... end; 从日志中(因为我们无法在客户机器上
TProcessor.function1(objTemp : TGrandPa):boolean;
begin
objChildData := TChild1(objTemp);
....
end;
从日志中(因为我们无法在客户机器上调试),我们缩小了function1中的第一行有时并且仅在一个特定客户的机器上使objchildata为nil的范围。部署相同代码的其他地方似乎工作得很好
有人能解释一下为什么会发生这种情况和/或如何解决这种情况吗?似乎您正在对ObjChild执行某些操作。Create抛出异常,但由于某种原因被吞没(try..except子句为空的情况除外)-发生这种情况时,Create无法返回有效实例,而是返回
NIL
。它可以是构造函数内部调用的函数
如果您将在TObjChild.Create上执行的操作带到站点,也许我们可以发现问题。您可以使用远程调试器(从Delphi 3或4开始提供)调试客户计算机上运行的代码
无论如何,根据日志,您如何确定objTemp参数不是nil?可能当TChild1(objTemp)为nil时,objTemp为nil。尝试记录
objTemp.ClassName
tooth问题不在于安全或不安全的强制转换,而在于错误地假设Create将始终返回一个对象。事实上,当Create失败时,它返回nil。您必须调试TChild1。创建构造函数。
TProcessor.function1(objTemp : TGrandPa):boolean;
begin
objChildData := TChild1(objTemp);
....
end;