function TReportDB.GetReport(var RecList:TList):Boolean;
var
..
  for j := IndexList.Count - 1 downto 0 do
      begin
        FileSeek(m_nFileHandle,SizeOf(RCV_REPORT_STRUCTEx)*(StrToInt(IndexList.Strings[j])),0);
        FileRead(m_nFileHandle,Buf,SizeOf(RCV_REPORT_STRUCTEx));
        if m_StockList.Strings[i] = Buf.m_szLabel then
        begin
          New(pBuf);
          pBuf^ := Buf;
          RecList.Add(pBuf);
          Break;
        end;
      end;
end;
我的目的是得到一个链表(RecList),链表会在另外一个地方创建和释放。但是这段代码会造成内存的自动增长,不知道怎么控制啊。请指教!

解决方案 »

  1.   

    调试看值 
    RecList.Add(pBuf);
      

  2.   

    正常的,你用New(pBuf);来分配内存了,内存就会添加
      

  3.   

    可是我在那里释放呢?
    在这个函数里Dispose(pBuf),好像数据会不对啊。
      

  4.   

    在"RecList.Add(pBuf);"之后将pBuf释放
      

  5.   

    而且RecList.Add()....本身也是再不断增加内存
      

  6.   

    在释放RecList时先要释放它里保存的数据,用一个循环,释放里面的每一个buf.
      

  7.   

    Dispose(pBuf);
           ~~~~~~~这个参数类型必须和New()中的参数类型一致
      

  8.   

    建议你直接返回一个TList,result被赋值之后就dispose(pbuf)
      

  9.   

    TLIST中保存的是一个指针.要是在添加后就dispose(pbuf)会造成返回的TLIST保存的全部都是无效指针的。
      

  10.   

    问题就在于你使用了TList链表,TList中保存的仅仅是数据指针,当TList释放的时候也只是将TList本身释放掉了,而该指针指向的内存区域并没有释放掉,因此导致你在函数中new获得的内存在链表释放的时候并没有释放掉.
    建议:改用其他具有确定数据类型的List类,或者从TList继承一个新类,自己重写释放代码.
      

  11.   

    假设 pBuf的定义如下
    var
      pBuf: PMyRec;其中
      PMyRec = ^TMyRec;
      TMyRec = record
        ...
      end;则
      New(pBuf); 
    执行结果是分配了SizeOf(TMyRec)大小的内存,并使pBuf指向该内存。