Skip to content

Tag-icone-mini.png 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
Configurações no Projeto Configurações do madExcept

Se ativou o madExcept corretamente, estes fontes serão adicionados ao projeto automaticamente:
Uses adicionados automaticamente

É necessário ativar o ReportMemoryLeaksOnShutdow no .dpr:
Ativando o ReportMemoryLeaksOnShutdow

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:
Tela de report do madExcept
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:

Clicando na linha

Abrirá a unit no delphi na linha informada:
Ao clicar duas vezes abrirá a unit no Delphi

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:
Função onde é populada a variavel local

Neste ponto é executada a função que vimos getProdutoByReferenciaUnica, que cria o objeto TProdutoServico e passa a referência para a variável oProduto.
Função onde é populada a variavel local

Mesmo a variável oProduto sendo de escopo local, podemos ver que o não é liberado da memória no final da procedure (FreeAndNil)
Variavel de escopo local

Finally não contem o freeAndNil da variável oProduto

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.
FreeAndNil da variável oProduto

Páginas relacionadas:

Exemplos de Vazamento de Memória