请高手帮我看看,我这段程序运行一次后,再次运行时就显示‘out of memory’
,请问该如何释放内存?
procedure TFormGprs.GetDbMeterCopyInfo(s:string);
var
  i : integer;
  gprsnotemp :string;
  mq:string;
begin
  //s:='';
  with DM_Info.SQLQueryPrjCopy do begin
    Close;
    Sql.clear;
    sql.Add('SELECT METER_NO,GPRS_NO,COPYPRJNAME,SPOT_NO,GprsModemFlag,MoneyType,Cos,type,ver,ReadStep,SetFlag FROM T_METER_INFO '+ s +' order by GPRS_NO, Line_No,area_no');
    try
      Open;
      First;
    except
    end;
    nMeterNum := 0; i := 0; nCceNum := 0;
    if s='' then s:=' where ' else s:=s+' and ';
    while not Eof do begin
      application.ProcessMessages ;
      Inc(nMeterNum);
      Inc(nCceNum);
      SetLength(sGprsNo, nMeterNum);
      SetLength(sMeterNo, nMeterNum);
      SetLength(sGprsModem,nMeterNum);
      SetLength(sDCUVER, nMeterNum);
      SetLength(sSpotName, nMeterNum);
      SetLength(sLst645CmdArray, nMeterNum);
      SetLength(sLstGprsCmdArray, nMeterNum);
      setlength(sDcuMeterNum,nMeterNum);
      Setlength(sLstModemCmdArray,nMeterNum);
      Setlength(nNoCopyPoint,nMeterNum);
      Setlength(sReadStep,nMeterNum);
      Setlength(sSetFlag,nMeterNum);
      SetLength(kOrder,nMeterNum);
      SetGridSize(StringGridCopyInfo, nMeterNum + 1, 7); //行数,列数      sGprsNo[i] := FieldByName('Gprs_No').AsString;
      sGprsModem[i] := FieldByName('GprsModemFlag').AsString;
      sDCUVER[i]:=FieldByName('Ver').AsString;
      sMeterNo[i] := FieldByName('Meter_No').AsString;
      sSpotName[i] := FieldByName('Spot_No').AsString;
      sReadStep[i]:= FieldByName('ReadStep').AsString;
      sSetFlag[i]:= FieldByName('SetFlag').AsString;      SetGridCopyInfoData(StringGridCopyInfo, sSpotName[i], sGprsNo[i], sMeterNo[i], sGprsModem[i], i);     with DM_Info.SQLQuery1  do begin
      Close;
      Sql.clear;
      //mq:= 'SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+'''  order by GPRS_NO, Line_No,area_no';
      sql.Add('SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+'''  order by GPRS_NO, Line_No,area_no');
      try
        Open;
        First;
      except
      end;
      sDcuMeterNum[i]:=DM_Info.SQLQuery1.RecordCount;
      close;
     end;      sLst645CmdArray[i] := TStringList.Create;
      sLst645CmdArray[i].Add('Link-DCU');
      sLstGprsCmdArray[i] := TStringList.Create;
      nNoCopyPoint[i]:= TStringList.Create;
      if sGprsModem[i]='GPRS' then begin
      sLstGprsCmdArray[i].Add(Generic645Bauds1200(sGprsNo[i])); //S485-00
      sLstGprsCmdArray[i].Add(GenericVer(sGprsNo[i])); //Ver
      end
      else begin
      sLstGprsCmdArray[i].Add('');
      sLstGprsCmdArray[i].Add('');
      end;      nNoCopyPoint[i].Add ('0');
      nNoCopyPoint[i].Add ('0');      //根据抄表方案取得抄表命令列表
      DM_Info.SQLQueryPrj.Close;
      DM_Info.SQLQueryPrj.Prepared := True;
      DM_Info.SQLQueryPrj.Params[0].Value := FieldByName('CopyPrjName').AsString;
      try
        DM_Info.SQLQueryPrj.Open;
      except
      end;
      kOrder[i]:=2;
      DM_Info.SQLQueryPrj.First;
      while not DM_Info.SQLQueryPrj.Eof do begin
        sLst645CmdArray[i].Add(DM_Info.SQLQueryPrj.FieldByName('DI').AsString);
        if sGprsModem[i]='GPRS' then
        sLstGprsCmdArray[i].Add(Generic645RdCmd(sGprsNo[i], sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
        if sGprsModem[i]='以太网' then
        sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
        if sGprsModem[i]='串口' then begin
          sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
          sLstModemCmdArray[i,kOrder[i]]:= OnsendCmd;
        end;
        nNoCopyPoint[i].Add ('0');        inc(kOrder[i]);
        DM_Info.SQLQueryPrj.Next;
      end;
      DM_Info.SQLQueryPrj.Close;
      Inc(i);
      Next;
      StatusBarGprs.Panels[0].Text :=inttostr(i);
    end;  end;
  DM_Info.SQLQueryPrjCopy.Close;
end;

解决方案 »

  1.   

    代码太多,看的眼晕~一般释放内存的方法如下:
    Create <=> Free
    New(P) <=> Despose(P)
    GetMem(P, 256) <=> FreeMem(P, 256)
    P := GetMemory(256) <=> FreeMemory(P)
    SetLength(s, 256) <=> SetLength(s, 0)
      

  2.   

    这么多SetLength(sLstGprsCmdArray, nMeterNum);
    它们的实际分配长度总共是多少?
      

  3.   

    out of memory把物理内存都吃光了,什么东西这个利害啊