帮我看看这段代码为什么会内存自增? Delphi / Windows SDK/APIhttp://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指向该内存。