Programação, Delphi
Conceito
Nesta página são disponibilizadas informações técnicas para uso da ferramenta madExcept, para auxiliar na identificação e correção
de vazamentos de memória utilizando o Delphi.
Instalação da ferramenta
Para instalar, devemos fazer o download da ferramenta disponibilizado pelo site oficial: madshi.net
Irá baixar o arquivo madCollection.exe.
Executar o Instalador. Selecionar as opções marcadas como na imagem e clicar em Install
Tela de instalação
Fechar o delphi antes de instalar e instalar normalmente como o cnPack. Ao abrir o delphi vamos ativar o madExcept nas opções do projeto.
Configurando no projeto
Após instalar é necessário ativar o report de vazamentos por projeto, no Delphi

Se ativou o madExcept corretamente, estes fontes serão adicionados ao projeto automaticamente:
É necessário ativar o ReportMemoryLeaksOnShutdow no .dpr:
Analisando a tela de report e encontrando o vazamento no código fonte
Executar o projeto normalmente em modo debug, para este exemplo executamos o TotaliMiddlewareService.exe.
Para trazer o report de vazamentos é necessário fechar o programa normalmente, não irá reportar ao parar a execução pelo Delphi.
Ao fechar, caso ocorra algum vazamento de memória, mostrará esta tela:
Nesta tela podemos ver a unit, a função e até a linha da instância que gerou o vazamento
Irá mostrar onde foi criado o objeto que não foi liberado da memória.
A sequencia de exceução vem de baixo para cima:
Clicando duas vezes na linha do report, abrirá a unit no Delphi diretamente na linha informada:
Duplo-clique nesta linha na tela do report:

Abrirá a unit no delphi na linha informada:
Corrigindo vazamentos de memória
O vazamento de memória mais simples que pode acontecer é um objeto de escopo local sendo criado e não sendo destruído no final do procedimento.
Usando as imagens anteriores como exemplo, sabemos o objeto que foi criado e está vazando memória (TProdutoServico).
Utilizando o report do madExcept, vamos encontrar onde é usado.
Clique duplo onde mostra a função TServicoPersisteDAV.SetaParametros:
Neste ponto é executada a função que vimos getProdutoByReferenciaUnica, que cria o objeto TProdutoServico e passa a referência para a variável oProduto.
Mesmo a variável oProduto sendo de escopo local, podemos ver que o não é liberado da memória no final da procedure (FreeAndNil)

Para corrigir, neste caso, o processo é simples.
Basta Liberar da memória usando FreeAndNil().
Por boas práticas, validamos se o objeto está instanciado (Assigned), isso evita erros de Access Violation se a variável não foi instanciada.
Páginas relacionadas: