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



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

我声明单元范围中的指针:

private
  CurrentRXFrame: ^TSXcpFrame;

每当我的程序接收到一帧时,指针就会更新,指向这个最新的帧:

procedure TfrmFoo.OnReceivingFrame(Sender: TObject);
var
  SXcpFrame: TSXcpFrame;
begin
  SXcpFrame := TSXcpFrame.Create();
  CurrentRXFrame := @SXcpFrame;

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

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

例外:

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

如果我在这一行之前设置了一个断点,那么相关变量的评估结果如下:

CurrentRXFrame := $18FD10
CurrentRXFrame^ := nil
CurrentRXFrame^.FrameBytes := Inaccessible value

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

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

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

var
  CurrentRXFrame: TSXcpFrame;

稍后:

  SXcpFrame := TSXcpFame.Create;
  CurrentRXFrame := SXcpFrame;

当然还有:

  PrintMsg(IntToHex(CurrentRXFrame.FrameBytes[0], 2));

注意,SXcpFrameCurrentRXFrame不是结构,它们只是对一个结构的引用,因此在赋值时,不复制数据,只复制引用。具有数据的实例的结构存在于堆中。赋值后,两个引用引用的数据相同。

相关内容

  • 没有找到相关文章

最新更新