Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado

Olá,

Recentemente observei que havia um memory leak no meu sistema em Delphi com uniGUI. A mensagem é a seguinte: 
------------------------------------------------------------------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

13 - 20 bytes: UnicodeString x 1
53 - 60 bytes: TdocZipCollection x 1
61 - 68 bytes: TRetDistDFeInt x 1
------------------------------------------------------------------------------------

Reparei que estava ocorrendo um memory leak envolvendo o componente "TRetDistDFeInt", do ACBr, e comecei a investigar a origem.

Analisando o código, identifiquei que na unit "ACBrCTeWebServices", a classe "TDistribuicaoDFe" possui dois pontos onde é criada uma instância da classe "TretDistDFeInt":
* no construtor  da classe
* no método "Clear"

O problema observado é que, no meu cenário, o método "Clear" é executado antes do construtor.
Com isso, o "Clear" cria uma instância de "TretDistDFeInt" e, posteriormente, o construtor cria uma nova instância, fazendo com que a primeira seja perdida, resultando em memory leak.

Para contornar o problema, incluí uma validação no construtor para evitar a recriação do objeto caso ele já exista:
------------------------------------------------------------------------------------
constructor TDistribuicaoDFe.Create(AOwner: TACBrDFe);
begin
  inherited Create(AOwner);

  FOwner := AOwner;
  if not Assigned(FretDistDFeInt) then FretDistDFeInt := TretDistDFeInt.Create(AOwner, 'CTe');
end;
------------------------------------------------------------------------------------

Minha dúvida é se esse comportamento é esperado (erro de uso da minha parte) ou pode se tratar de uma falha no fluxo de criação dentro da classe "TDistribuicaoDFe"?

Desde já, agradeço se puderem verificar ou orientar sobre a abordagem correta.

  • Consultores
Postado
2 horas atrás, Grupo FS disse:

Olá,

Recentemente observei que havia um memory leak no meu sistema em Delphi com uniGUI. A mensagem é a seguinte: 
------------------------------------------------------------------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

13 - 20 bytes: UnicodeString x 1
53 - 60 bytes: TdocZipCollection x 1
61 - 68 bytes: TRetDistDFeInt x 1
------------------------------------------------------------------------------------

Reparei que estava ocorrendo um memory leak envolvendo o componente "TRetDistDFeInt", do ACBr, e comecei a investigar a origem.

Analisando o código, identifiquei que na unit "ACBrCTeWebServices", a classe "TDistribuicaoDFe" possui dois pontos onde é criada uma instância da classe "TretDistDFeInt":
* no construtor  da classe
* no método "Clear"

O problema observado é que, no meu cenário, o método "Clear" é executado antes do construtor.
Com isso, o "Clear" cria uma instância de "TretDistDFeInt" e, posteriormente, o construtor cria uma nova instância, fazendo com que a primeira seja perdida, resultando em memory leak.

Para contornar o problema, incluí uma validação no construtor para evitar a recriação do objeto caso ele já exista:
------------------------------------------------------------------------------------
constructor TDistribuicaoDFe.Create(AOwner: TACBrDFe);
begin
  inherited Create(AOwner);

  FOwner := AOwner;
  if not Assigned(FretDistDFeInt) then FretDistDFeInt := TretDistDFeInt.Create(AOwner, 'CTe');
end;
------------------------------------------------------------------------------------

Minha dúvida é se esse comportamento é esperado (erro de uso da minha parte) ou pode se tratar de uma falha no fluxo de criação dentro da classe "TDistribuicaoDFe"?

Desde já, agradeço se puderem verificar ou orientar sobre a abordagem correta.

Existe e estou também investigando

  • Obrigado 1

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • 4 semanas depois ...
  • Consultores
Postado
Em 30/12/2025 at 11:08, Grupo FS disse:

Olá,

Recentemente observei que havia um memory leak no meu sistema em Delphi com uniGUI. A mensagem é a seguinte: 
------------------------------------------------------------------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

13 - 20 bytes: UnicodeString x 1
53 - 60 bytes: TdocZipCollection x 1
61 - 68 bytes: TRetDistDFeInt x 1
------------------------------------------------------------------------------------

Reparei que estava ocorrendo um memory leak envolvendo o componente "TRetDistDFeInt", do ACBr, e comecei a investigar a origem.

Analisando o código, identifiquei que na unit "ACBrCTeWebServices", a classe "TDistribuicaoDFe" possui dois pontos onde é criada uma instância da classe "TretDistDFeInt":
* no construtor  da classe
* no método "Clear"

O problema observado é que, no meu cenário, o método "Clear" é executado antes do construtor.
Com isso, o "Clear" cria uma instância de "TretDistDFeInt" e, posteriormente, o construtor cria uma nova instância, fazendo com que a primeira seja perdida, resultando em memory leak.

Para contornar o problema, incluí uma validação no construtor para evitar a recriação do objeto caso ele já exista:
------------------------------------------------------------------------------------
constructor TDistribuicaoDFe.Create(AOwner: TACBrDFe);
begin
  inherited Create(AOwner);

  FOwner := AOwner;
  if not Assigned(FretDistDFeInt) then FretDistDFeInt := TretDistDFeInt.Create(AOwner, 'CTe');
end;
------------------------------------------------------------------------------------

Minha dúvida é se esse comportamento é esperado (erro de uso da minha parte) ou pode se tratar de uma falha no fluxo de criação dentro da classe "TDistribuicaoDFe"?

Desde já, agradeço se puderem verificar ou orientar sobre a abordagem correta.

analisando o processo dos demais componentes. 

esse estava com o erro indicado.

está no SVN

At revision: 44423

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Fundadores
Postado
Em 30/12/2025 at 11:08, Grupo FS disse:

O problema observado é que, no meu cenário, o método "Clear" é executado antes do construtor.

Em que situação que o Clear seria executado, antes do Create ?  (isso não parece estar correto)

Não podemos delegar, a criação de objetos, para o método Clear... quem deve criar os objetos é o Create

@Juliomar Marchetti, eu reverti o commit... o código está suscetível a ocorrências de A.V.

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
Postado
51 minutos atrás, Daniel Simoes disse:

Em que situação que o Clear seria executado, antes do Create ?  (isso não parece estar correto)

Não podemos delegar, a criação de objetos, para o método Clear... quem deve criar os objetos é o Create

@Juliomar Marchetti, eu reverti o commit... o código está suscetível a ocorrências de A.V.

Se abrir a unit ACBrNFeWebServices.pas irá notar que temos o mesmo processo

só que lá não é feito no create é só no clear.

sim o clear é chamado ao abrir a aplicaçaõ na tela.

se criar um projeto zerado. jogar um componente TACBrCTe e colocar um ponto de para no Create e no Clear vai notar que ele será feito ambos. só no executar.

Talvez então em ambos no Clear devamos modificar para não fazer isso. 

veja o call stack

image.png

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Consultores
Postado

note que é algo herdado.

então no ACBrNFeWebServices foi removido o create já no CTe não e com isso gera o memory mas não vai gerar A.V.

image.png

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Fundadores
Postado

Não entendi suas colocações, ou como posso reproduzir o problema...

Não há lógica, chamar o método "Clear", de um objeto que ainda não foi criado... se isso estiver ocorrendo, esse é o erro de programação...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
Postado

Vou postar a chamada do método com prints do código assim consigo mostrar o que está de equivocado acima só no CTe

a classe TDistribuicaoDFe herda da TCTeWebService

image.png

o seu create também:

image.png

então ele TCTeWebservice herda TDFeWebServices

image.png

tem o create

image.png

e finalmente chegamos no TDFeWebService

image.png

e no Create finalmente temos a chamada do Clear;

image.png

Então ele cria lá no create e depois ele chama o Clear dentro do TDFeWebServices e deixa o vazamento.

para testar e ver ocorrer

basta criar um projeto qualquer zerado. jogar um componente TACBrCTE

no dpr habilitar o ReportMemoryLeaksOnShutdown := True;

basta compilar e abrir o projeto e fechar vai estourar o vazamento

 

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Fundadores
Postado

Mude a ordem de chamada dos Creates...

constructor TDistribuicaoDFe.Create(AOwner: TACBrDFe);
begin
  FOwner := AOwner;
  FretDistDFeInt := TretDistDFeInt.Create(AOwner, 'CTe');

  inherited Create(AOwner);  // < ---- AQUI ----
end;

 

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

  • Consultores
Postado

Boa noite
fiz a alteração conforme descrito e adicionei com algumas melhorias

At revision: 44459

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • 1 mês depois ...
  • Consultores
Postado

Tópico fechado por falta de retorno do usuário

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...