想象一下下面的记录:
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与消息访问冲突.)。
如何正确访问字节数组?
发布于 2016-12-14 18:22:15
问题是对托管类型使用GetMem和FreeMem。这是一个错误,因为它们没有初始化和最后确定托管类型。注意,它是管理的,因为它包含一个动态数组。如果它包含一个接口、一个字符串、一个变体等等,那么它将被管理。
通过使用New分配和Dispose去分配来解决问题。这些存在是为了执行GetMem和FreeMem不做的事情,即初始化和最后确定托管类型。
https://stackoverflow.com/questions/41149193
复制相似问题