当前位置: 首页 > news >正文

头大的内存泄漏

头大的内存泄漏

function LoadTemplateJsonFromDB(ATemplateID: Integer): TJSONObject;//注意返回对象
varQ: TFDQuery;S: string;RootVal: TJSONValue;RootArr: TJSONArray;
beginResult := nil;Q := TFDQuery.Create(nil);tryQ.Connection := UniMainModule.FDConnection1;Q.SQL.Text :='SELECT template_json FROM user001.ops_report_template WHERE id = :tid';Q.ParamByName('tid').AsInteger := ATemplateID;Q.Open;if Q.IsEmpty thenExit;S := Trim(Q.FieldByName('template_json').AsString);finallyQ.Free;end;if S = '' thenExit;
//一定要这样处理!!!!!!RootVal := TJSONObject.ParseJSONValue(S);if RootVal = nil thenExit;tryif RootVal is TJSONArray thenbeginRootArr := TJSONArray(RootVal);if RootArr.Count > 0 thenResult := TJSONObject(RootArr.Items[0].Clone);  // ★ Clone 出来交给外部endelse if RootVal is TJSONObject thenResult := TJSONObject(RootVal.Clone);finallyRootVal.Free;   // ★ 无论如何释放根节点,避免泄漏 TJSONArray/TListend;
end;

这个内存泄漏相当难查。是一个非常隐蔽的大坑。