我有这样的程序:
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库都没有泄漏。
发布于 2014-01-20 10:28:06
泄漏有几个明显的原因。
一个肯定是泄漏的对象是您创建但未能销毁的js对象。使用try/finally块保护其生存期:
js := TlkJSON.ParseText( mystream.DataString ) as TlkJsonObject;
try
...
finally
js.Free;
end;更微妙的是不受保护的mystream。如果在分配mystream之后并在其被销毁之前引发异常,则会泄漏该对象。同样,您应该使用与上面演示的完全相同的成语来使用try/finally块来保护这一点。如果您的函数引发异常,那么mystream的问题只会成为您的一个问题。虽然这里的情况可能不是这样,但您必须始终以上面所示的方式保护对象。
无论如何,您肯定应该在程序中进行一些泄漏跟踪。很可能会有更多的泄漏。以下是您需要采取的第一步:
您可能在程序运行期间有泄漏,但是当程序关闭时,所有这些都会被清理。这些都很难跟踪,并需要一些额外的工具,你的程序。
https://stackoverflow.com/questions/21231320
复制相似问题