Ir para conteúdo
  • Cadastre-se

Anizair Lopes

Membros
  • Total de ítens

    53
  • Registro em

  • Última visita

Tudo que Anizair Lopes postou

  1. Olá Daniel Simões, Em Testes feito com o DUnit e o FastMM ocorreu o seguinte problema. Quando estava setado true nas Lista internas do Objeto TRegistro60M não estava sendo liberado os objetos internos ou seja ficando os ObjectList interno sem ser liberado. Ex : tinha 30 Registro60M e ficavam 30 Registro60A, 30 Registro60D, e 30 Registro60I. Quando eu fiz o procedimento de correção citado no post o fastMM não mas acusou estes registros como leaks de memoria. ou seja, significa que foram todos liberados. vou voltar o codigo original fazer um teste com o fastMM e postar os logs aqui. Analise os logs, e se achar alguma outra correção favor postar aqui. ConthabWinTests_MemoryManager_EventosLog.txt ConthabWinTests_MemoryManager_EventosLog.txt
  2. Olá a todos já que niguém me respondeu a questão do memory leak no AcbrSintegra referente ao post anterior quero dizer que já encontrei a solução para o problema e gostaria que fosse corrigido no SVN para quando eu fizer um update do repositório não perdesse a minha codificação. Bom a solução e bastante simples e somente iremos alterar a classe TRegistro60M no seu metodo create que está conforme mostrado abaixo: constructor TRegistro60M.Create; begin inherited Create; FRegs60A:=TRegistros60A.Create(True); FRegs60D:=TRegistros60D.Create(True); FRegs60I:=TRegistros60I.Create(True); end; iremos alterar e colocar um false para criar as listas sem ser Owner para que a responsabilidade de destruir a lista fique por nossa conta abaixo segue o codigo corrigido. constructor TRegistro60M.Create; begin inherited Create; FRegs60A:=TRegistros60A.Create(False); FRegs60D:=TRegistros60D.Create(False); FRegs60I:=TRegistros60I.Create(False); end; agora no método destrutor da classe TRegistro60M iremos destruir as listas referentes aos registros 60A, 60I e 60D conforme codificação abaixo: destructor TRegistro60M.Destroy; begin FreeAndNil(FRegs60A); FreeAndNil(FRegs60D); FreeAndNil(FRegs60I); inherited; end; Feito isso não existirá mais leaks de memória para esse registos. Espero ter ajudado e qualquer dúvida entre em contato.
  3. Olá estou utilizando o ACBrSintegra em um projeto e detectei alguns memory leaks nos registros 60A, 60D, 60I.. Um bloco de memória vazou. O tamanho é: 116 Este bloco foi alocado pela thread 0x5C0, e a análise da pilha interna (endereços de retorno) no momento era: 40AA1E [..\..\biblioteca\rede unifar\FastMM4.pas][FastMM4][DebugReallocMem][6990] 402A8F [System][@ReallocMem] 423CB0 [Classes][TList.SetCapacity] 423AE8 [Classes][TList.Grow] 4238F9 [Classes][TList.Add] 442FB9 [Contnrs][TObjectList.Add] 5AFF20 [ACBrSintegra.pas][ACBrSintegra][TRegistros60D.Add][3030] 5A96D4 [ACBrSintegra.pas][ACBrSintegra][TACBrSintegra.GerarConjuntoRegistros60][1579] 5A938B [ACBrSintegra.pas][ACBrSintegra][TACBrSintegra.GeraArquivo][1507] 5B7ED0 [..\Model\UnitModelGerarArquivos.pas][UnitModelGerarArquivos][TModelGerarArquivos.GerarArquivo][114] 5B8294 [\\des03\Fontes\prjdelphi\ConthabWin\Model\dunit\UnitModelGerarArquivosTests.pas][UnitModelGerarArquivosTests][TModelGerarArquivosTests.TestGerarArquivo][70] O bloco está sendo usado por um objeto da classe: Desconhecida e o final do registro de log encontra-se assim Essa aplicação teve vazamentos de memória. Os vazamentos dos blocos pequenos são (excluindo os vazamentos esperados registrados por ponteiro): 13 - 20 bytes: TObjectList x 3, TRegistros60D x 30, TRegistros60I x 30, TRegistros60A x 30, AnsiString x 1, Desconhecida x 3 21 - 36 bytes: TWinHelpViewer x 1, AnsiString x 2, Desconhecida x 3 37 - 52 bytes: THelpManager x 1, TStringList x 3, Desconhecida x 34 101 - 116 bytes: Desconhecida x 8 165 - 180 bytes: Desconhecida x 13 213 - 244 bytes: Desconhecida x 1 277 - 308 bytes: Desconhecida x 3 341 - 388 bytes: Desconhecida x 1 Nota: O detalhe do vazamento de memória está logado em um arquivo texto na mesma pasta que essa aplicação. Para desabilitar essa checagem de vazamento de memória, desabilite o DEFINE "EnableMemoryLeakReporting". Analisando a linha de erro gerado pelo DUnit o problema está nas linha de codigo abaixo procedure TACBrSintegra.GerarConjuntoRegistros60; var i: Integer; wregistro60M: TRegistro60M; begin //associo todos os registros 60A/D/I criados a um registro 60M existente //com esta abordagem permite-se que o usuario adicione registros fora //de ordem na aplicacao cliente, ex: adiciona analitico primeiramente ao master. //Com isto não há obrigacao de amarrar analitico ao master..deixando por conta do componente //nao sei dizer se este processo de ordenacao efetuado pode tornar-se lento if FVersaoValidador=vv524 then begin //60A for i:=0 to Registros60A.Count - 1 do begin wregistro60M:=GetRegistro60M(Registros60A[i].Emissao,Registros60A[i].NumSerie); if not Assigned(wregistro60M) then raise Exception.Create(ACBrStr('Registro 60A sem registro 60M correspondente!'+#13+ DateToStr(Registros60A[i].Emissao)+' - '+Registros60A[i].NumSerie)); wregistro60M.Regs60A.Add(Registros60A[i]); end; //60D for i:=0 to Registros60D.Count - 1 do begin wregistro60M:=GetRegistro60M(Registros60D[i].Emissao,Registros60D[i].NumSerie); if not Assigned(wregistro60M) then raise Exception.Create(ACBrStr('Registro 60D sem registro 60M correspondente!'+#13+ DateToStr(Registros60D[i].Emissao)+' - '+Registros60D[i].NumSerie)); wregistro60M.Regs60D.Add(Registros60D[i]); end; //60I for i:=0 to Registros60I.Count - 1 do begin wregistro60M:=GetRegistro60M(Registros60I[i].Emissao,Registros60I[i].NumSerie); if not Assigned(wregistro60M) then raise Exception.Create(ACBrStr('Registro 60I sem registro 60M correspondente!'+#13+ DateToStr(Registros60I[i].Emissao)+' - '+Registros60I[i].NumSerie)); wregistro60M.Regs60I.Add(Registros60I[i]); end; //ordenando e gerando de acordo com o manual... Registros60M.Sort(Sort60M); for i:=0 to Registros60M.Count-1 do begin //removido pois sintegra tem ordem propria e nao consegui sortear os //objetos na lista de objetos com mais de um campo // Registros60M[i].Regs60A.Sort(Sort60A); // Registros60M[i].Regs60D.Sort(Sort60D); // Registros60M[i].Regs60I.Sort(Sort60I); GerarRegistros60M(Registros60M[i]); GerarRegistros60A(Registros60M[i].Regs60A); GerarRegistros60D(Registros60M[i].Regs60D); GerarRegistros60I(Registros60M[i].Regs60I); end; end Gostaria de uma resolução para este problema, pois já tentei de todas as formas e não obtive sucesso.
×
×
  • 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...
The popup will be closed in 10 segundos...