delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
帮我看看这段代码为什么会内存自增? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061217101112135.html
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),链表会在另外一个地方创建和释放。但是这段代码会造成内存的自动增长,不知道怎么控制啊。请指教!  
 

调试看值    
  RecList.Add(pBuf);  
 

New(pBuf);  
  不加才怪

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

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

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

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

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

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

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

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

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

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

posted on 2008-10-14 16:34 delphi2007 阅读(106) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。