TvarRec并在delphi中释放内存

时间:2014-11-05 07:40:40

标签: delphi memory-management

我试图在DataSet中公开记录。

procedure TMSExtQuery.CloneCurRecord(IgnoreFields: array of const);
begin
  AppendRecord(RecordFieldsValue(IgnoreFields));
end;

function TMSExtQuery.RecordFieldsValue(IgnoreFields: array of const): TFieldsArray;
var
  Idx: integer;
  V: Variant;
begin
  SetLength(Result, FieldCount);
  for Idx := 0 to Pred(FieldCount) do
  begin
    if not FieldInArray(Fields[Idx], IgnoreFields) then
      Result[Idx] := VarToVarRec(Fields[Idx].Value)
    else
      Result[Idx] := VarToVarRec(Null);
  end;
end;

function VarToVarRec(const AInput: Variant): TVarRec;
begin
  New(Result.VVariant);
  Result.VType := vtVariant;
  Result.VVariant^ := AInput;
end;

当我创建动态变量时,我必须释放为其分配的内存。 例如:

function VarToVarRec(const AInput: Variant): TVarRec;
var
  V: PVariant;
begin
  New(V);
  V^ := AInput;
  Result.VType := vtVariant;
  Result.VVariant := V;
  Dispose(V);
end;

当我做的时候

New(Result.VVariant);

我必须释放内存,还是Delphi?

2 个答案:

答案 0 :(得分:2)

你必须释放它。 TVarRec是一种仅用于 作为参数的类型,通常由运行时管理,但仅在运行时分配并填充时,以array of const。否则,您可以自行管理它们。

更多这里,在我写的一篇文章中(最后有管理TVarRecs的代码:) Open array parameters and array of const

答案 1 :(得分:0)

鲁迪,谢谢你的链接。我已经阅读并且这样做了

procedure TMSExtQuery.RecordFieldsValue(IgnoreFields: array of const; out Result: TFieldsArray);
var
  Idx: integer;
begin
  SetLength(Result, FieldCount);
  for Idx := 0 to Pred(FieldCount) do
  begin
    New(Result[Idx].VVariant);
    Result[Idx].VType := vtVariant;
    if not FieldInArray(Fields[Idx], IgnoreFields) then
      Result[Idx].VVariant^ := Fields[Idx].Value
    else
      Result[Idx].VVariant^ := Null;
  end;
end;

procedure TMSExtQuery.CloneCurRecord(IgnoreFields: array of const);
var
  Args: TFieldsArray;
begin
  RecordFieldsValue(IgnoreFields, Args);
  AppendRecord(Args);
  FinalizeVarRecArray(Args);
end;

procedure TMSExtQuery.FinalizeVarRecArray(var Arr: TFieldsArray);
var
  I: Integer;
begin
  for I := Low(Arr) to High(Arr) do
    Dispose(Arr[I].VVariant);
  Arr := nil;
end;