FastMM e Delphi 2006

Continuando um tema anteriormente publicado, neste artigo vamos começar a detectar os vazamentos de memória (memory leaks) existentes em nossos aplicativos. (isso se existirem, é claro…)

A partir do Delphi 2006 o gerenciador de memória padrão que acompanha o Delphi passa a ser o FastMM. Quem não trabalha com Delphi 2006 pode baixar o FastMM aqui.

Se você estiver começando agora a desenvolver com Delphi deve estar se perguntando: Tá, e dai? O que é memory leak?

Memory leak é um objeto criado pela aplicação que não foi corretamente destruído.

Você pode simular esta situação criando qualquer objeto no OnCreate do formulário principal da sua aplicação. Exemplo:

procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally

  end;
end;

Execute o aplicativo e feche-o. Você notará que não acontece nada! :)

Esse teste ridículo foi feito só para você ver como é comum ocorrerem problemas que resultem em vazamentos de memória (memory leaks) como a falta de atenção (nesse caso), a pressa, Control+C / Control+V entre alguns outros.

Agora insira esta linha logo após o begin da sua procedure:

ReportMemoryLeaksOnShutdown := True;

Deixando o código assim:

procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally

  end;
end;

Repita a operação e veja o que acontece após fechar o aplicativo:

Veja que recebemos a notificação do TStringList que criamos e das 3 linhas que adicionamos (String x 3) a ele. A partir dai podemos começar a evitar esse tipo de erro na hora de desenvolvermos aplicativos.

Uma dica importante é você utilizar o bloco try…finally…end; sempre que criar um objeto dinamicamente. Isto evita que ocorra um erro no meio da execução e ele não seja destruído devidamente. Veja os dois exemplos:

Método não apropriado:

procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  lstVazamento.Add('Linha 1');
  lstVazamento.Add('Linha 2');
  lstVazamento.Add('Linha 3');
  lstVazamento.Free;
end;

Método apropridado de utilização:

procedure TForm1.FormCreate(Sender: TObject);
var
  lstVazamento : TStrings;
begin
  ReportMemoryLeaksOnShutdown := True;

  lstVazamento := TStringList.Create;
  try
    lstVazamento.Add('Linha 1');
    lstVazamento.Add('Linha 2');
    lstVazamento.Add('Linha 3');
  finally
    lstVazamento.Free;
  end;
end;

Utilizando o bloco try…finally…end; mesmo que ocorra algum erro na execução do procedimento o objeto é destruído. Pelo método não apropriado lstVazamento não seria destruído caso ocorresse algum problema na execução da linha lstVazamento.Add(‘Linha 1′);, por exemplo.

Em tempo: utilizando ReportMemoryLeaksOnShutdown := True; a mensagem ocorrerá sempre que o aplicativo for terminado, inclusive fora do Delphi. Para evitarmos esse situação, substitua o True por DebugHook <> 0; deixando a linha assim:

ReportMemoryLeaksOnShutdown := DebugHook <> 0;

Para quem utiliza outras versões do Delphi isto deve ser configurado no arquivo FastMM4Options.inc.

No próximo artigo abordaremos mais funções do FastMM e configurações do arquivo FastMM4Options.inc para quem utiliza FastMM em versões mais antigas do Delphi. Até mais!


7 comentários em 'FastMM e Delphi 2006' »

Assine os comentários usando RSS ou faça um TrackBack para 'FastMM e Delphi 2006'.

[-]
[+]
Luiz disse,

Em 22 de fevereiro de 2007 às 16:47

Já tentei utilizar o FastMM com o Delphi 6 mas na hora de debugar (com o F7) acabava debugando também as funções do FastMM… Bom pode ser que eu tenha feito besteira. O que interessa é que eu percebi uma leve diferença no consumo de memória e no tamnaho do executavel.

 
[-]
[+]
Everson disse,

Em 20 de janeiro de 2008 às 13:24

Como posso instalar o FastMM para o Delphi 7!

Se alguem possuir um passo-a-passo ficarei agradecido!

Obrigado amigos..
Abraço

 
[-]
[+]
Anizair disse,

Em 15 de abril de 2008 às 18:07

Estou utilizando o delphi 2006 em um projeto e preciso saber como utilizar o FastMM para encontrar vazamento de memoria em aplicações que rodam como Serviço do Windows. caso possa me auxiliar sou grato…

 
[-]
[+]
tarcisio disse,

Em 13 de junho de 2008 às 15:10

estou precisando de um livro sobre o delphi 2006, nem uma loja vende este livro, alguem pode mim ajudar?

[-]
[+]
Gabriel Toledo disse,

Em 16 de fevereiro de 2009 às 21:53

Boa noite Tarcisio ,

também preciso dessa apostila para o delphi 2006 , não encontro em lugar algum você conseguiu alguma coisa que possa estar me enviando ?

aguardo sua resposta.


Obrigado.

 
 
[-]
[+]
Guilherme disse,

Em 07 de julho de 2008 às 14:07

tendo o delphi 2006 garbage collection, dificilmente teremos vazamento de leak, faz mais sentido usar o fastmm no delohi 7 q nao tem GC. ou estou errado?

 
[-]
[+]
Edson disse,

Em 11 de setembro de 2009 às 11:23

Correto, as ultimas versoes do Delphi ja nao trazem esse problema de vazamento de memoria nao, o proprio compilador corrige isso, basta fazer uma consulta nos manuais do delphi, a partir das versoes 2006. Se isso acontece, com certeza a Microssoft, ja teria caido matando em cima dos produtos da Borland.