Grupo FS Postado 30 Dezembro, 2025 Postado 30 Dezembro, 2025 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 Juliomar Marchetti Postado 30 Dezembro, 2025 Consultores Postado 30 Dezembro, 2025 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 1 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Juliomar Marchetti Postado 24 Janeiro Consultores Postado 24 Janeiro 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 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Daniel Simoes Postado 25 Janeiro Fundadores Postado 25 Janeiro 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. Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Consultores Juliomar Marchetti Postado 25 Janeiro Consultores Postado 25 Janeiro 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 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Juliomar Marchetti Postado 25 Janeiro Consultores Postado 25 Janeiro 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. Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Daniel Simoes Postado 26 Janeiro Fundadores Postado 26 Janeiro 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... Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Consultores Juliomar Marchetti Postado 26 Janeiro Consultores Postado 26 Janeiro 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 o seu create também: então ele TCTeWebservice herda TDFeWebServices tem o create e finalmente chegamos no TDFeWebService e no Create finalmente temos a chamada do Clear; 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 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Daniel Simoes Postado 26 Janeiro Fundadores Postado 26 Janeiro 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; 1 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Consultores Juliomar Marchetti Postado 26 Janeiro Consultores Postado 26 Janeiro Boa noite fiz a alteração conforme descrito e adicionei com algumas melhorias At revision: 44459 Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 Daniel Simoes Postado 27 Janeiro Fundadores Postado 27 Janeiro Analisei as mudanças.. Parecem corretas... 1 Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Consultores Juliomar Marchetti Postado 20 Março Consultores Postado 20 Março Tópico fechado por falta de retorno do usuário Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br 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 !!
Recommended Posts