如何在Delphi中将作为参数传递的Proc引用赋值给记录字段?
解决Delphi中匿名方法引用赋值导致的GPF错误
问题根源
你遇到的GPF错误,核心原因是给TMyRec记录添加了packed关键字。TMyProc是Delphi的匿名方法类型(属于引用类型),这类类型的内部实现依赖特定的内存对齐规则,而packed会强制记录按1字节边界紧密排列,破坏了匿名方法引用所需的内存对齐要求,最终导致赋值时触发非法内存访问。
修复方案
直接去掉TMyRec定义中的packed关键字即可:
type TMyProc = reference to procedure ( i_ : integer ); PMyRec = ^TMyRec; TMyRec = record // 移除packed修饰 i : integer; proc : TMyProc; end;
额外说明
- Delphi的引用类型(包括匿名方法、接口、字符串、动态数组等)本质是指针包装类型,要求内存地址按指针大小对齐(32位程序为4字节,64位程序为8字节)。
packed会覆盖默认的对齐规则,导致这类字段的内存布局异常。 - 你的示例代码中分配内存后立即释放,实际业务场景中如果需要保留
TMyRec实例,注意不要提前调用FreeMem,否则后续无法访问记录内的proc字段。
内容的提问来源于stack exchange,提问作者SOLID Developper
相关产品推荐
相关产品推荐

