首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大循环中的内存泄漏

大循环中的内存泄漏
EN

Stack Overflow用户
提问于 2014-04-04 21:24:28
回答 1查看 154关注 0票数 0

我有一个从数据库中检索一些文本的小过程。这个函数在一个循环中被调用几千次。

代码语言:javascript
复制
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;

上面的过程在这个过程中被调用:

代码语言:javascript
复制
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;

主要周期如下:

代码语言:javascript
复制
  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,直到挂起为止。我知道这不是一个具体的问题,但我找不到泄密处。有人能指出我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-04 21:59:30

从这段代码中没有什么明显的飞跃。最有可能的情况是,如果此代码负责泄漏,则该代码调用的函数才会泄漏。

通过将FastMM完全调试版本添加到项目中来调试此版本。它将发现泄漏,并给您调用堆栈来标识泄漏内存的分配位置。这些都是足够的信息来理解和修复漏洞。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22873290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档