gpt4 book ai didi

delphi - 在另一个指针内访问记录的指针

转载 作者:行者123 更新时间:2023-12-03 18:35:12 26 4
gpt4 key购买 nike

想象以下记录:

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

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

最佳答案

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

使用 New 解决问题分配和Dispose去分配。这些存在是为了做什么GetMemFreeMem不要这样做,即初始化和完成托管类型。

关于delphi - 在另一个指针内访问记录的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com