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的时候,不给这个数组赋值,就能正常释放。释放前面两句代码,注销与不注销都报错
 

解决方案 »

  1.   

    这两句的代码根本就不是你想要的SetLength(POnLineMeter^.CommandData, sizeof(ArrayTemp)); //ArrayTemp另外定义的TArrayByte变量
    Move(ArrayTemp, POnLineMeter^.CommandData, sizeof(ArrayTemp));SizeOf(ArrayTemp) 永远是4
    动态数组的生存期是自动管理的,只有用“:=”才能保证不会出错。像你这里用 Move 是强行覆盖,引用计数不会增加。在你 Dispose 之前,TArrayByte 成员早就被释放过了,再去释放当然是无效指针了。另外,由于动态数组是引用类型,从你这里的代码水平看,很难保证在复制 ArrayTemp 时,每一个元素都不是浅复制,很可能还会遇到其它问题