在Delphi中,如何在FreeAndNil的64位发行版中解决访问冲突问题(当64位调试版工作时?)>

问题描述 投票:0回答:1

这是我的问题的一些简化代码上下文:

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过程中,创建了TJPEGImageTGraphic后代),然后分配给Picture

因为我不在一个类中(record helper中没有构造函数),所以我无法将Picture初始化为nil。因此,FreeAndNil崩溃了。奇怪的是,在32位版本中,它似乎已初始化为nil,但在64位版本中则不是(它是“无法访问的值”)。因此,我添加了try except。但是,即使在64位版本中也很奇怪,我也遇到了try except未捕获的访问冲突。

总结:

  • 由于魔术(?),Picture初始化为nil,因此[32位版本+调试版本是可以的,所以没有例外-一切都很好
  • [64位调试Picture被初始化为“无法访问的值”,它触发Assigned,然后FreeAndNil执行访问冲突,但try捕获了它,所以一切都很好]
  • 64位发行版(不知道如何调试CPU组件,所以不确定会发生什么情况,但是try不能捕获访问冲突,并且错误会很糟糕地抛出给用户
  • 我该怎么解决?

这里是我的问题的一些简化代码上下文:TSomeone = record FirstName:String;姓氏:字符串;图片:TGraphic;结束; TSomeoneHelper = TSomeone公共的记录助手...

delphi exception 64-bit access-violation
1个回答
0
投票

在构建类型和体系结构之间工作原理不同的事实很幸运。这应该在任何地方都不起作用(OP注释仅确认了我的想法)。

© www.soinside.com 2019 - 2024. All rights reserved.