在另一个指针

时间:2016-12-14 18:02:28

标签: delphi

想象一下以下记录:

type
  PSocket_Tunneling = ^TSocksServer_Socket_Tunneling;
  TSocksServer_Socket_Tunneling = record
    Socks_Queue: array of byte;
  end;

Socks_Queue,动态数组,我最近了解到它是一个指针。

好的,现在我们在另一个指针内分配这条记录:

var
  Socket_State: PSocket_Tunneling;
begin
  GetMem(Socket_State, SizeOf(TSocksServer_Socket_Tunneling));
  try
    Socket.Data:= Socket_State;
   with PSocket_Tunneling(Socket.Data)^ do
   begin
     SetLength(Socket_State.Socks_Queue, 10);
   end;
  except
    FreeMem(Socket.Data);
    Socket.Close;
  end;
end;

Socket.Data是一个指针。 SetLength行给了我访问冲突(引发异常类$ C0000005,消息访问冲突......)。

我应该如何正确访问字节数组?

1 个答案:

答案 0 :(得分:2)

问题是您使用GetMemFreeMem作为托管类型。这是一个错误,因为他们没有初始化并最终确定托管类型。请注意,它是受管理的,因为它包含动态数组。如果它包含接口,字符串,变体等,它将被管理。

使用New分配和Dispose分配来解决问题。这些存在可以执行GetMemFreeMem不执行的操作,即初始化和最终确定托管类型。