type
TArrayByte =Array of Array of Byte; //定义数据结构
PTOnLineMeter =^TOnlineMeter;
TOnLineMeter =packed record
SocketID :TSocket;
CommandData :TArrayByte;
end;
//定义一个TList
OnLineMeterList_GPRS
//new一个结构
POnLineMeter :PTOnLineMeter;
New(POnLineMeter);
SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));
OnLineMeterList_GPRS.Add(POnLineMeter);//释放
for i :=OnLineMeterList_GPRS.Count -1 downto 0 do
begin
if delSocket =PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.SocketID then
begin
//SetLength(PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData, 0);
//PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData :=Nil;
Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));
OnLineMeterList_GPRS.Delete(i);
end;
end;
Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));这一句运行的时候报无效指针,我猜大概是这个数组造成的,因为如果在new的时候,不给这个数组赋值,就能正常释放。释放前面两句代码,注销与不注销都报错
TArrayByte =Array of Array of Byte; //定义数据结构
PTOnLineMeter =^TOnlineMeter;
TOnLineMeter =packed record
SocketID :TSocket;
CommandData :TArrayByte;
end;
//定义一个TList
OnLineMeterList_GPRS
//new一个结构
POnLineMeter :PTOnLineMeter;
New(POnLineMeter);
SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));
OnLineMeterList_GPRS.Add(POnLineMeter);//释放
for i :=OnLineMeterList_GPRS.Count -1 downto 0 do
begin
if delSocket =PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.SocketID then
begin
//SetLength(PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData, 0);
//PTOnLineMeter(OnLineMeterList_GPRS.Items[i])^.CommandData :=Nil;
Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));
OnLineMeterList_GPRS.Delete(i);
end;
end;
Dispose(PTOnLineMeter(OnLineMeterList_GPRS.Items[i]));这一句运行的时候报无效指针,我猜大概是这个数组造成的,因为如果在new的时候,不给这个数组赋值,就能正常释放。释放前面两句代码,注销与不注销都报错
Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));SizeOf(ArrayTemp) 永远是4
动态数组的生存期是自动管理的,只有用“:=”才能保证不会出错。像你这里用 Move 是强行覆盖,引用计数不会增加。在你 Dispose 之前,TArrayByte 成员早就被释放过了,再去释放当然是无效指针了。另外,由于动态数组是引用类型,从你这里的代码水平看,很难保证在复制 ArrayTemp 时,每一个元素都不是浅复制,很可能还会遇到其它问题