Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1226800
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-10-14 16:38:58



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指向该内存。  
 



[新闻]Silverlight对Flash 微软打垮Adobe
博客园首页 社区 新闻频道 小组 博问 网摘 闪存
阅读(401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~