Compreender e impedir vazamentos de memória no Delphi

DelphiO suporte da programação orientada a objetos é rico e poderoso. Classes e objetos permitem programação de código modular. Juntamente com componentes mais modulares e mais complexos, surgem mais sofisticados e mais complexos insetos.

Ao desenvolver aplicações em Delphi é (quase) sempre divertido, há situações em que você sente que o mundo inteiro está contra você.

Sempre que você precisar usar (criar) um objeto no Delphi, precisará liberar a memória consumida (uma vez que não é mais necessário). Certamente, os blocos de proteção de memória try / finalmente podem ajudar a evitar vazamentos de memória; ainda depende de você proteger seu código.

Um vazamento de memória (ou recurso) ocorre quando o programa perde a capacidade de liberar a memória que consome. Vazamentos repetidos de memória fazem com que o uso da memória de um processo cresça sem limites. Vazamentos de memória são um problema sério - se você tiver um código causando vazamento de memória, em um aplicativo em execução 24/7, o aplicativo consome toda a memória disponível e, finalmente, faz a máquina parar de responder.

instagram viewer

Vazamentos de memória em Delphi

O primeiro passo para evitar vazamentos de memória é entender como eles ocorrem. A seguir, é apresentada uma discussão sobre algumas armadilhas comuns e práticas recomendadas para escrever código Delphi sem vazamento.

Na maioria das aplicações (simples) Delphi, nas quais você usa os componentes (botões, memorandos, edições, etc.) que você solta em um formulário (em tempo de design), não precisa se preocupar muito com o gerenciamento de memória. Depois que o componente é colocado em um formulário, ele se torna seu proprietário e liberará a memória obtida pelo componente assim que o formulário for fechado (destruído). O formulário, como proprietário, é responsável pela desalocação de memória dos componentes hospedados. Em resumo: os componentes em um formulário são criados e destruídos automaticamente

Exemplos de vazamentos de memória

Em qualquer aplicativo Delphi não trivial, você desejará instanciar componentes Delphi em tempo de execução. Você também terá algumas de suas próprias classes personalizadas. Digamos que você tenha uma classe TDeveloper que possua o método DoProgram. Agora, quando você precisar usar a classe TDeveloper, crie uma instância da classe chamando o Crio método (construtor). O método Create aloca memória para um novo objeto e retorna uma referência ao objeto.

var
zarko: TDeveloper
início
zarko: = TMyObject. Crio;
zarko. DoProgram;
fim;

E aqui está um simples vazamento de memória!

Sempre que você cria um objeto, você deve descartar a memória que ocupava. Para liberar a memória de um objeto alocado, você deve chamar o Livre método. Para ter certeza, você também deve usar o bloco try / finally:

var
zarko: TDeveloper
início
zarko: = TMyObject. Crio;
experimentar
zarko. DoProgram;
finalmente
zarko. Livre;
fim;
fim;

Este é um exemplo de código seguro de alocação e desalocação de memória.

Algumas palavras de aviso: Se você deseja instanciar dinamicamente um componente Delphi e liberá-lo explicitamente algum tempo depois, sempre passe nulo como proprietário. Não fazer isso pode apresentar riscos desnecessários, além de problemas de desempenho e manutenção de código.

Além de criar e destruir objetos usando os métodos Create e Free, você também deve ter muito cuidado ao usar recursos "externos" (arquivos, bancos de dados, etc.).
Digamos que você precise operar em algum arquivo de texto. Em um cenário muito simples, em que o método AssignFile é usado para associar um arquivo em um disco a um arquivo variável ao terminar o arquivo, você deve chamar CloseFile para liberar o identificador do arquivo para iniciar usava. É aqui que você não tem uma chamada explícita para "Grátis".

var
F: TextFile;
S: corda;
início
AssignFile (F, 'c: \ somefile.txt');
experimentar
Readln (F, S);
finalmente
CloseFile (F);
fim;
fim;

Outro exemplo inclui carregar DLLs externas do seu código. Sempre que você usa o LoadLibrary, você deve chamar FreeLibrary:

var
dllHandle: THandle;
início
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// faça algo com esta DLL
se dllHandle <> 0 então FreeLibrary (dllHandle);
fim;

Vazamentos de memória no .NET?

Embora com o Delphi for .NET o coletor de lixo (GC) gerencie a maioria das tarefas de memória, é possível haver vazamentos de memória nos aplicativos .NET. Aqui está um artigo de discussão GC no Delphi para .NET.

Como combater vazamentos de memória

Além de escrever código modular seguro para a memória, é possível evitar vazamentos de memória usando algumas das ferramentas de terceiros disponíveis. Delphi Ferramentas de correção de vazamento de memória ajudá-lo a pegar o aplicativo Delphi erros como corrupção de memória, vazamentos de memória, erros de alocação de memória, erros de inicialização variável, conflitos de definição variável, erros de ponteiro e muito mais.

instagram story viewer