【问题标题】:Access a pointer of a record inside another pointer在另一个指针内访问记录的指针
【发布时间】:2016-12-15 02:31:23
【问题描述】:

想象以下记录:

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 与消息访问冲突...)。

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

【问题讨论】:

  • 这与您的崩溃无关,但您的with 语句没有用,因为您不是通过with 访问记录字段,而是直接访问局部变量。如果您想正确使用with,请从SetLength() 语句中删除Socket_State.,否则只需删除with(无论如何您都应该这样做)。
  • 好的,谢谢您的建议。

标签: delphi


【解决方案1】:

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

通过使用New 分配和Dispose 取消分配来解决问题。它们的存在是为了做GetMemFreeMem 不做的事情,即初始化和最终确定托管类型。

【讨论】:

  • 太棒了!谢谢!
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多