这是我的问题的一些简化代码上下文:
TSomeone = record FirstName: String; LastName: String; Picture: TGraphic; end; TSomeoneHelper = record helper for TSomeone public procedure Clear(); procedure LoadFromFile(const Filename: String); end; procedure TSomeoneHelper.Clear(); begin Self.FirstName := ''; Self.LastName:= ''; try if Assigned(Self.Picture) then FreeAndNil(Self.Picture); // <---- Crash here in 64-bit release except Self.Picture := nil; end; end;
通常,有人会声明一个
TSomeone
变量,然后调用myVar.LoadFromFile('myfile.blah')
来填充记录。在LoadFromFile
过程中,创建了TJPEGImage
(TGraphic
后代),然后分配给Picture
。
因为我不在一个类中(record helper
中没有构造函数),所以我无法将Picture
初始化为nil
。因此,FreeAndNil
崩溃了。奇怪的是,在32位版本中,它似乎已初始化为nil
,但在64位版本中则不是(它是“无法访问的值”)。因此,我添加了try except
。但是,即使在64位版本中也很奇怪,我也遇到了try except
未捕获的访问冲突。
总结:
Picture
初始化为nil
,因此[32位版本+调试版本是可以的,所以没有例外-一切都很好Picture
被初始化为“无法访问的值”,它触发Assigned
,然后FreeAndNil
执行访问冲突,但try
捕获了它,所以一切都很好]try
不能捕获访问冲突,并且错误会很糟糕地抛出给用户我该怎么解决?
这里是我的问题的一些简化代码上下文:TSomeone = record FirstName:String;姓氏:字符串;图片:TGraphic;结束; TSomeoneHelper = TSomeone公共的记录助手...
在构建类型和体系结构之间工作原理不同的事实很幸运。这应该在任何地方都不起作用(OP注释仅确认了我的想法)。