Ir para conteúdo
  • Cadastre-se

dev botao

Memory Leak


tiagoshimizu
  • Este tópico foi criado há 3199 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal, estou executando o seguinte em meu projeto:

procedure Consulta(Certificado, CNPJ, UF: String);
var
  ACBrNFe: TACBrNFe;
begin
  try
    ACBrNFe := TACBrNFe.Create(nil);
    ACBrNFe.Configuracoes.Certificados.NumeroSerie := Certificado;
    ACBrNFe.DownloadNFe.Download.CNPJ := CNPJ;
    ACBrNFe.Configuracoes.WebServices.UF := UF;
    ACBrNFe.Configuracoes.WebServices.Ambiente := taProducao;
    ACBrNFe.DownloadNFe.Download.tpAmb := taProducao;
    ACBrNFe.ConsultaNFeDest(CNPJ, inTodas, ieTodos, '');
  finally
    FreeAndNil(ACBrNFe);
  end;
end;

No arquivo .dpr, incluo o seguinte linha:

ReportMemoryLeaksOnShutdown := True;

Quando encerro a aplicação, é gerado um memory leak.

 

Está certo isso?

 

Estou com a versão do svn 6748.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Prezados, aproveitando o tópico há um memory leak

unit AcbrNFeConfiguracoes.pas

 

na função

 

TCertificadosConf.GetCertificado: ICertificate2

 

A variável Lista do tipo TStringList não está sendo destruída. Grande abraço

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Prezados, aproveitando o tópico há um memory leak

unit AcbrNFeConfiguracoes.pas

 

na função

 

TCertificadosConf.GetCertificado: ICertificate2

 

A variável Lista do tipo TStringList não está sendo destruída. Grande abraço

 

Tem certeza?

 

Analisando o código não parece ocorrer o memory leak. (linha 536 em diante)

            Lista := TStringList.Create;
            try
              Lista.Text := Propriedades;
               for K:=0 to Lista.Count-1 do
                begin
                 if (Pos('2.16.76.1.3.3',Lista.Strings[K]) > 0) then
                  begin
                    FCNPJ := StringReplace(Lista.Strings[K],'2.16.76.1.3.3=','',[rfIgnoreCase]);
                    FCNPJ := OnlyNumber(HexToAscii(RemoveString(' ',FCNPJ)));
                    break;
                  end;
                end;
            finally
              Lista.free;
            end;

João Henrique de Souza

 

Manual de como configurar o TortoiseSVN para não ficar mostrando a senha repetidas vezes (somente para commiters):

https://sourceforge.net/p/forge/community-docs/TortoiseSVN/

 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
Prezado, o código constante na unit q tenho está conforme abaixo, não possuía o try. Por este motivo reportei o problema do leak. Irei atualizar pelo repositório e posto o resultado. Gde abraço e obrigado pela resposta
 
      for J:=1 to Cert.Extensions.Count do
       begin
         Extension := IInterface(Cert.Extensions.Item[J]) as IExtension;
         Propriedades := Extension.EncodedData.Format(True);
         if (Pos('2.16.76.1.3.3',Propriedades) > 0) then
          begin
            Lista := TStringList.Create;
            Lista.Text := Propriedades;
            for K:=0 to Lista.Count-1 do
             begin
               if (Pos('2.16.76.1.3.3',Lista.Strings[K]) > 0) then
                begin
                  FCNPJ := StringReplace(Lista.Strings[K],'2.16.76.1.3.3=','',[rfIgnoreCase]);
                  FCNPJ := OnlyNumber(HexToAscii(RemoveString(' ',FCNPJ)));
                  break;
                end;
             end;
            break;
          end;
         Extension := nil;
       end;
 
      break;
    end;
  end;
 
  if not(Assigned(Result)) then
    raise EACBrNFeException.Create('Certificado Digital não encontrado!');
Editado por wendelswl
Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Olá parceiros,

 

Identificamos memory leak na unit pcnNFe.pas na linha 2023, segue trecho do código:

 

constructor TIde.Create(AOwner: TNFe);
begin
  inherited Create;
  FNFref := TNFrefCollection.Create(Self);

//  refNFP := TRefNFP.Create; // no repositório está assim
  FrefNFP := TRefNFP.Create;  //<--- acredito que deveria ser assim
end;

destructor TIde.Destroy;
begin
  FNFref.Free;
  FrefNFP.Free; //<--- esta linha precisa ser adicionada.
  inherited;
end;

 

Até mais.

 

PS: a revisão do repositório é a 9078.

Editado por dosmontes
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Olá parceiros,

Identificamos memory leak na unit ACBrNFeWebServices.pas na linha 1159, caso não tenha sido definido um certificado digital,

pois a procedure ConfiguraReqResp gera uma exceção quebrando o bloco try..finally, segue trecho do código:

  {$IFDEF ACBrNFeOpenSSL}
   HTTP := THTTPSend.Create;
  {$ELSE}
   {$IFDEF SoapHTTP}
    ReqResp := THTTPReqResp.Create(nil);
    ReqResp.UseUTF8InHeader := True;
   {$ELSE}
    ReqResp := TACBrHTTPReqResp.Create;  // <--- vai gerar memory leak caso não tenha sido informado um certificado
   {$ENDIF}
   ConfiguraReqResp( ReqResp ); // <--- memory leak no objeto THTTPReqResp, pois essa linha gera uma exceção
   ReqResp.URL := URL;
   ReqResp.SoapAction := SoapAction;
  {$ENDIF}
  FEnvelopeSoap := UTF8Encode(FEnvelopeSoap);
 

sugestão:

  {$IFDEF ACBrNFeOpenSSL}
   HTTP := THTTPSend.Create;
  {$ELSE}
   {$IFDEF SoapHTTP}
    ReqResp := THTTPReqResp.Create(nil);
    ReqResp.UseUTF8InHeader := True;
   {$ELSE}
    ReqResp := TACBrHTTPReqResp.Create;
   {$ENDIF}
  {$ENDIF}

  try
    {$IFNDEF ACBrNFeOpenSSL}
    ConfiguraReqResp( ReqResp ); // <-- gera a exceção controlada por try..finally
    ReqResp.URL := URL;
    ReqResp.SoapAction := SoapAction;
    {$ENDIF}
    FEnvelopeSoap := UTF8Encode(FEnvelopeSoap);

...

Até mais.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Se possível, anexe aqui o arquivo alterado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3199 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.