如何取消引用指向类实例的指针?

DBe*_*nko 0 delphi pointers delphi-7 dereference

问题摘要:我指向一个类实例的指针,但是,当我尝试取消引用此指针并访问实例的属性时,我得到一个EAccessViolation异常,因为它取消引用"Nil".

我在单位范围内声明了指针:

private
  CurrentRXFrame: ^TSXcpFrame;
Run Code Online (Sandbox Code Playgroud)

每次我的程序收到一个帧时,指针都会更新为指向这个最新的帧:

procedure TfrmFoo.OnReceivingFrame(Sender: TObject);
var
  SXcpFrame: TSXcpFrame;
begin
  SXcpFrame := TSXcpFrame.Create();
  CurrentRXFrame := @SXcpFrame;
Run Code Online (Sandbox Code Playgroud)

我尝试在同一单元中的其他一些例程中取消引用指针,但得到一个异常:

// `FrameBytes` is merely a dynamic array of type "Byte".
PrintMsg(IntToHex(CurrentRXFrame^.FrameBytes[0], 2)); 
Run Code Online (Sandbox Code Playgroud)

例外:

raise exception class EAccessViolation with message 'Access violation at address 004DD1FE [...] Read of address 00000010.

如果我在此行之前设置断点,则相关变量评估为:

CurrentRXFrame := $18FD10
CurrentRXFrame^ := nil
CurrentRXFrame^.FrameBytes := Inaccessible value
Run Code Online (Sandbox Code Playgroud)

问题:如何TSxcpFrame通过指针访问类实例的属性?

Rud*_*uis 9

问题是你有一个指向变量的指针,如果这是一个局部变量,它很快就会失效.

但没有必要这样做.类实例引用已经是指针,所以你可以(或者,IMO,应该)做:

var
  CurrentRXFrame: TSXcpFrame;
Run Code Online (Sandbox Code Playgroud)

后来:

  SXcpFrame := TSXcpFame.Create;
  CurrentRXFrame := SXcpFrame;
Run Code Online (Sandbox Code Playgroud)

而且当然:

  PrintMsg(IntToHex(CurrentRXFrame.FrameBytes[0], 2));
Run Code Online (Sandbox Code Playgroud)

注意,SXcpFrame并且CurrentRXFrame它们不是结构,它们仅仅是对一个的引用,因此在赋值时,不会仅对引用进行数据的复制.具有数据的实例的结构存在于堆上.赋值后,两个引用都引用相同的数据.