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.