Published by Joao Morais on 06 Feb 2008 at 08:26 am
Como remover vazamentos de memória
Ferramentas como FastMM melhoram o desempenho de aplicações que utilizam muita alocação dinâmica, e de quebra ainda relata se a aplicação está deixando vazamentos de memória.
Agora saber que a aplicação tem vazamento de memória é fácil, no entanto, dependendo do tamanho do projeto, torna-se mais difícil determinar aonde ela foi alocada.
Os passos abaixo ajudam a localizar a criação do objeto (em Delphi). Bom, o problema não é o fato de ele ter sido criado, mas sim de não ter sido destruido. Se este objeto não tem contagem de referência, então o trabalho será bem mais simples.
- Baixe o MemCheck aqui
- Coloque-o como a primeira unit do seu .dpr (temporariamente no lugar do seu gerenciador de memória);
- logo após o begin, coloque uma chamada à procedure MemChk;
- Em project | options | compiler, ligue o stack frames;
- Em project | options | linker, ligue o include TD32 debug info;
- Dê um build all no projeto.
Quando sua aplicação for fechada, o MemChk vai gerar uma exception no ponto em que o projeto aloca memória que não foi desalocada.
Depois de resolver o vazamento, lembre-se de voltar ao seu gerenciador de memória, desabilitar o stack frames e as informações de debug.
Se você tiver outras dicas, deixe-as nos comentários.
2 Responses to “Como remover vazamentos de memória”
Leave a Reply
You must be logged in to post a comment.
Silvio Clécio on 06 Jul 2009 at 10:53 pm #
Olá João,
Eu cheguei a testar um gerenciador do cnpack no Delphi 7, mas ele não chega a ser tão bom quanto o FastMM, e outra, depois que li um email seu sobre a Borland ter adotado o FastMM como gerenciador de memória, pelo menos para o Delphi eu acredito que não vou usar outra ferramenta, o FastMM é completo.
Abraços,
Silvio Clécio
marcosmoreira16 on 05 Oct 2010 at 9:02 am #
Olá João.
Sou iniciante em Delphi, e estou desenvolvendo um programa pequeno. Estava funcionando muito bem até que começou a mostrar um erro sempre ao fechar o sistema.
Tenho um formulário principal que chama os demais. Consigo efetuar cadastros, lançamentos e até gerar os relatórios. O problema ocorre quando fecho o formulário principal.
Fiz o procedimento do “memCheck” e aparece uma caixa com a seguinte mensagem de erro:
Project Pfc.exe raised exception class EMemoryLeak with message ’second release of
block attempt, already freed’. Process stopped. Us Step or Run to continue.
E depois vai aparecendo várias mensagens de erro.
Não sei como conferir o resultado do “memCheck”.
Você pode me dar umas dicas?