类方法:
function TAdoHelper.GetDataSet(sqlstr: string; params: TStrings): TDataSet;
var
  TempQuery: TAdoQuery;
begin
  TempQuery:= TAdoQuery.Create(nil);
  TempQuery.Connection:= FConnector;
  TempQuery.Close;
  TempQuery.SQL.Clear;
  TempQuery.SQL.Add(sqlstr);
  TempQuery.Prepared;
  FillParameters(TempQuery,Params);
  TempQuery.Open;
  result:= TempQuery;
end;客户端:
result:= MySqlHelper.GetDataSet(SQL_GetUserDataSet);这样返回临时对象的引用,函数内部的临时对象tempquery何时释放?如果不释放会不会造成内存泄露?

解决方案 »

  1.   

    如果客户端的result没有free的话,会产生内存泄漏,即分配给tempquery的内存块没有了引用。
    对于class类型的返回值,建议改成过程,使用变参传入。
      

  2.   

    function TAdoHelper.GetDataSet(sqlstr: string; params: TStrings): TDataSet;
    begin
      Result := TAdoQuery.Create(nil);
      with Result do
      begin
        Connection:= FConnector;
        Close;
        SQL.Clear;
        SQL.Add(sqlstr);
        Prepared;
         FillParameters(Result,Params);
        Open;
      end;
    end;客户端:
    AdataSet :=  MySqlHelper.GetDataSet(SQL_GetUserDataSet);
    ....
    ADataSet.Free;  // 这样就干净了。。