Recent

Author Topic: [RESOLVIDO]Memória não liberada nesse trecho de código  (Read 3403 times)

andersonscinfo

  • Full Member
  • ***
  • Posts: 132
[RESOLVIDO]Memória não liberada nesse trecho de código
« on: May 22, 2014, 02:44:54 am »
Boa noite, não concegui detectar onde neste trecho de código estou deixando de liberar a memória:

código:
Code: [Select]
procedure TFormImportaNFe.FormCreate(Sender: TObject);
  function GetFieldType(AP: TTypeKind):TFieldType;
  begin
    case AP of
      tkInt64, tkInteger: Result:=ftInteger;
      tkFloat: Result:=ftFloat;
    else
      Result:=ftString;
    end;
  end;
Var
  C, I: Integer;
  L: PPropList;
  P: TPropInfo;
  T: TFieldType;
begin
  NFe:=TOBNFe.Create;
  Ds:=TDataSource.Create(Self);
  Mem:=TMemDataset.Create(Self);
  C:=GetPropList(TCNFeProduto.ClassInfo, tkAny, nil);
  GetMem(L, C * SizeOf(TPropInfo));
  GetPropList(TCNFeProduto, L);
  with Mem.FieldDefs do
    begin
      Add('pro_id', ftInteger);
      for I := 0 to C - 1 do
        begin
          P:=TPropInfo(L^[I]^);
          T:=GetFieldType(P.PropType^.Kind);
          if T = ftString then
            Add(P.Name, T, 100)
          else
            Add(P.Name, T);
        end;
    end;
  Dispose(L);
  Mem.CreateTable;
  Mem.Active:=True;
  Ds.DataSet:=Mem;
  DBGridImportacaoItens.DataSource:=Ds;
end;


status:
Quote
Heap dump by heaptrc unit                                                                                                   
227322 memory blocks allocated : 30648026/31280640                                                                         
227321 memory blocks freed     : 30642644/31275256                                                                         
1 unfreed memory blocks : 5382                                                                                             
True heap size : 2523136                                                                                                   
True free heap : 2517568                                                                                                   
Should be : 2517624

é um código bem simples mas to com dificuldade pra achar onde esta o furo.

Att.
Anderson Junior
« Last Edit: May 22, 2014, 01:20:11 pm by andersonscinfo »

engkin

  • Hero Member
  • *****
  • Posts: 3112
Re: Memória não liberada nesse trecho de código
« Reply #1 on: May 22, 2014, 03:20:18 am »
You don't need to call
Code: [Select]
GetMem(L, C * SizeOf(TPropInfo)); before
Code: [Select]
GetPropList(TCNFeProduto, L);
procedure TFormImportaNFe.FormCreate(Sender: TObject);
  function GetFieldType(AP: TTypeKind):TFieldType;
  begin
    case AP of
      tkInt64, tkInteger: Result:=ftInteger;
      tkFloat: Result:=ftFloat;
    else
      Result:=ftString;
    end;
  end;
Var
  C, I: Integer;
  L: PPropList;
  P: TPropInfo;
  T: TFieldType;
begin
  NFe:=TOBNFe.Create;
  Ds:=TDataSource.Create(Self);
  Mem:=TMemDataset.Create(Self);
  C:=GetPropList(TCNFeProduto.ClassInfo, tkAny, nil);
  GetMem(L, C * SizeOf(TPropInfo));
  GetPropList(TCNFeProduto, L);
  with Mem.FieldDefs do
    begin
      Add('pro_id', ftInteger);
      for I := 0 to C - 1 do
        begin
          P:=TPropInfo(L^^);
          T:=GetFieldType(P.PropType^.Kind);
          if T = ftString then
            Add(P.Name, T, 100)
          else
            Add(P.Name, T);
        end;
    end;
  Dispose(L);
  Mem.CreateTable;
  Mem.Active:=True;
  Ds.DataSet:=Mem;
  DBGridImportacaoItens.DataSource:=Ds;
end;

andersonscinfo

  • Full Member
  • ***
  • Posts: 132
Re: Memória não liberada nesse trecho de código
« Reply #2 on: May 22, 2014, 01:18:19 pm »
Thanks, fix and got settled, I saw that internally it already makes reserving memory, your tip helped me a lot.

Att.
Anderson Junior

 

TinyPortal © 2005-2018