将记录复制到动态分配的内存时,Delphi 7 引用计数错误

标签 delphi automatic-ref-counting

当我将带有托管字符串字段的记录类型变量分配给动态分配的缓冲区时,我在 Delphi 中遇到了奇怪的行为。它有什么问题以及如何纠正?

type
  PRec = ^TRec;
  TRec = packed record
    Foo: integer;
    Bar: string;
  end;

procedure Error;
var
  P, Q: PRec;
  R, T: TRec;
begin
  R.Foo := 1;
  R.Bar := 'Bar';
  T := R; // Ready
  Q := @T;
  Q^ := R; // Ready
  GetMem(P, SizeOf(TRec));
  P^ := R; // Access violation in _LStrAsg at 
           // "MOV     ECX,[EDX-skew].StrRec.refCnt"

  R := P^; // Just to keep reference while debugging
end;

最佳答案

您的记录是受管理的记录。因此,需要对其进行初始化。您的代码使用 GetMem ,它不会初始化记录。相反,您应该使用New。替换

GetMem(P, SizeOf(TRec));

New(P);

同样,当您需要取消分配时,您必须完成记录。使用 Dispose 而不是 FreeMem

如果出于某种原因需要手动初始化和完成,则可以这样做。看起来像这样:

// allocate and initialize
GetMem(P, SizeOf(P^));
Initialize(P^);

// finalize and deallocate
Finalize(P^);
FreeMem(P);

关于将记录复制到动态分配的内存时,Delphi 7 引用计数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807114/

相关文章:

delphi - 使用 TIdTCPServer 进行多播(Indy 9 + Delphi 7)

delphi - 如何处理在运行时与设计时创建的子组件和属性?

delphi - debugAPI中的框架是什么?

iphone - 核心数据: inserting Objects crashed in global queue [ARC - iPhone simulator 6. 1]

ios - 在 iPad 上的 iOS SDK 8.4 中的 ARC 下过度释放 MPMoviePlayerController

ios - XCode - “' autorelease' 不可用 : not available in ARC mode”

delphi - 如何防止表单隐藏时任务栏按钮消失

objective-c - 自动引用计数是否会在运行时产生成本

swift - 初始 View Controller 应该调用 "deinit"吗?

delphi - ExecSQL中的参数AExecDirect有什么作用?