首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

程序报‘out of memory’,怎么释放内存

2012-02-24 
程序报‘out of memory’,如何释放内存请高手帮我看看,我这段程序运行一次后,再次运行时就显示‘out of memor

程序报‘out of memory’,如何释放内存
请高手帮我看看,我这段程序运行一次后,再次运行时就显示‘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;


[解决办法]
代码太多,看的眼晕~

一般释放内存的方法如下:
Create <=> Free
New(P) <=> Despose(P)
GetMem(P, 256) <=> FreeMem(P, 256)
P := GetMemory(256) <=> FreeMemory(P)
SetLength(s, 256) <=> SetLength(s, 0)
[解决办法]
重启电脑后再调试运行,还有这个问题么?

热点排行