0

我有一个小程序可以从数据库中检索一些文本。该函数在一个周期内被调用数千次。

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,直到挂起。我知道这不是一个具体的问题,但我找不到泄漏。谁能指出我做错了什么?

4

1 回答 1

2

这段代码没有任何明显的飞跃。如果这段代码最有可能导致泄漏,那么这将是这段代码调用的函数导致泄漏。

通过将 FastMM 完整调试版本添加到您的项目来进行调试。它会发现泄漏,并为您提供识别泄漏内存分配位置的调用堆栈。总是有足够的信息来理解和修复泄漏。

于 2014-04-04T21:59:30.237 回答