首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Delphi的内存泄漏

使用Delphi的内存泄漏
EN

Stack Overflow用户
提问于 2014-01-20 10:19:26
回答 1查看 754关注 0票数 0

我有这样的程序:

代码语言:javascript
复制
procedure TMainForm.ExtractActor(const actor_id : string);
var
  mystream : TStringStream;
  js : TlkJSONobject;
begin
    mystream:= TStringStream.Create('');
    idHTTP1.Get(TIdURI.URLEncode('some dynamic url'),mystream);                                               
    js := TlkJSON.ParseText( mystream.DataString ) as TlkJsonObject;
    //insert
    if UniConnection1.Connected then
    begin
      UniQuery3.Params[0].Value:= StrToInt(js.getString('id'));
      UniQuery3.Open;
      if (UniQuery3.RecordCount = 0) then
      begin
        Uniquery2.Params[0].Value:= StrToInt(js.getString('id'));
        Uniquery2.Params[1].Text:= js.getString('name');
        Uniquery2.Params[2].Text:= js.getString('locale');
        Uniquery2.Params[3].Text:= js.getString('gender');
        Uniquery2.Params[4].Text:= js.getString('username');
        Uniquery2.Execute;
      end;
      UniQuery3.Close;
    end;
    mystream.Free;
end;

监视Windows任务管理器--我看到进程内存不断增加。大约一天后,我将得到内存不足的错误,应用程序将崩溃。我做错了什么?我假设JSON或Devart UniDAC库都没有泄漏。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-20 10:28:06

泄漏有几个明显的原因。

一个肯定是泄漏的对象是您创建但未能销毁的js对象。使用try/finally块保护其生存期:

代码语言:javascript
复制
js := TlkJSON.ParseText( mystream.DataString ) as TlkJsonObject;
try
  ...
finally
  js.Free;
end;

更微妙的是不受保护的mystream。如果在分配mystream之后并在其被销毁之前引发异常,则会泄漏该对象。同样,您应该使用与上面演示的完全相同的成语来使用try/finally块来保护这一点。如果您的函数引发异常,那么mystream的问题只会成为您的一个问题。虽然这里的情况可能不是这样,但您必须始终以上面所示的方式保护对象。

无论如何,您肯定应该在程序中进行一些泄漏跟踪。很可能会有更多的泄漏。以下是您需要采取的第一步:

  1. 更改您的代码,以便它使用FastMM的完整版本。
  2. 设置FastMM配置文件以进行完全调试。这可能涉及编辑.inc文件,如果您发现这太令人望而生畏,可以从这里使用GUI实用程序:http://jed-software.com/blog/?p=606
  3. 运行您的程序一段时间,然后关闭它。如果您有泄漏,这些应该在这一点上报告。
  4. 把你所有的漏洞都解决掉。

您可能在程序运行期间有泄漏,但是当程序关闭时,所有这些都会被清理。这些都很难跟踪,并需要一些额外的工具,你的程序。

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

https://stackoverflow.com/questions/21231320

复制
相关文章

相似问题

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