Delphi 大周期内内存泄漏
我有一个从数据库中检索文本的小程序。此函数在一个周期内调用数千次Delphi 大周期内内存泄漏,delphi,memory-leaks,delphi-xe,unidac,Delphi,Memory Leaks,Delphi Xe,Unidac,我有一个从数据库中检索文本的小程序。此函数在一个周期内调用数千次 procedure TMainForm.RetrieveKnowledgeText(const knowledge_id : Integer; var knowlegde_title : string; var knowledge_text : string
procedure TMainForm.RetrieveKnowledgeText(const knowledge_id : Integer;
var knowlegde_title : string;
var knowledge_text : string;
var knowledge_origin : string);
begin
knowlegde_title:= '';
knowledge_text:= '';
knowledge_origin:= '';
//get text + title
UniQuery3.Params[0].Value:= knowledge_id;
UniQuery3.Open;
while not UniQuery3.Eof do
begin
if (UniQuery3phrase_class.Value = 7) then
knowledge_text:= knowledge_text + #10#13
else
begin
if (UniQuery3phrase_class.Value = 1) then
knowlegde_title:= UniQuery3phrase_text.AsString;
knowledge_text:= knowledge_text + UniQuery3phrase_text.AsString+' ';
end;
UniQuery3.Next;
end;
UniQuery3.Close;
//get origin
UniQuery4.Params[0].Value:= knowledge_id;
UniQuery4.Open;
if not UniQuery4.Eof then
knowledge_origin:= AnsiLowercase(UniQuery4origin_filename.AsString);
UniQuery4.Close;
end;
上述过程在此过程中调用:
procedure TMainForm.ContextualizeKnowledge(const knowledge_id : Integer;
const knowledge_year : Integer;
const knowledge_month : Integer;
const knowledge_date : TDateTime;
const total_comments : Integer;
const title : string;
const origin : string);
var
knowledge_title : string;
knowledge_text : string;
knowledge_origin : string;
begin
knowledge_title:= '';
knowledge_text:= '';
knowledge_origin:= '';
RetrieveKnowledgeText(knowledge_id,
knowledge_title,
knowledge_text,
knowledge_origin);
//save into a text file
(...)
end;
主循环如下所示:
UniQueryRetrieveLastKnowledge.Params[0].Value:= last_context_knowledge_id;
UniQueryRetrieveLastKnowledge.Open;
while not UniQueryRetrieveLastKnowledge.Eof do
begin
ContextualizeKnowledge(UniQueryRetrieveLastKnowledge.FieldByName('knowledge_id').AsInteger,
main_year,
main_month,
UniQueryRetrieveLastKnowledge.FieldByName('knowledge_date').AsDateTime,
UniQueryRetrieveLastKnowledge.FieldByName('total_comments').AsInteger,
UniQueryRetrieveLastKnowledge.FieldByName('knowledge_description').AsString,
UniQueryRetrieveLastKnowledge.FieldByName('public_filename_or_url').AsString);
//
UniQueryRetrieveLastKnowledge.Next;
end;
UniQueryRetrieveLastKnowledge.Close;
我的应用程序内存使用量持续增加4k,直到挂起为止。我知道这不是一个具体的问题,但我找不到漏洞。有人能指出我做错了什么吗?这段代码没有明显的变化。最有可能的是,如果这段代码是泄漏的原因,那么这段代码调用的函数就是泄漏
通过将FastMM完全调试版本添加到项目中来调试此功能。它将查找泄漏,并为您提供调用堆栈,以确定泄漏内存的分配位置。这些信息总是足以理解和修复泄漏 将FastMM完全调试放在项目中,看看它是否能检测到您的泄漏。是什么让你决定Q中的代码包含故障?我对FastMM没有经验。我已经注释掉了所有其他的东西,所以除了这段代码之外,剩下的只有Unidac框架(来自Devart)和Delphi单元。谢谢,但乍一看,您是否发现在过程之间传递的参数有什么问题,或者其他什么问题?除了名称不正确的查询对象之外,我看不到任何东西。