想象一下以下记录:
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,消息访问冲突......)。
我应该如何正确访问字节数组?
答案 0 :(得分:2)
问题是您使用GetMem
和FreeMem
作为托管类型。这是一个错误,因为他们没有初始化并最终确定托管类型。请注意,它是受管理的,因为它包含动态数组。如果它包含接口,字符串,变体等,它将被管理。
使用New
分配和Dispose
分配来解决问题。这些存在可以执行GetMem
和FreeMem
不执行的操作,即初始化和最终确定托管类型。