Gerenciamento de Memória

Aplicações Delphi são aplicações nativas do Windows — elas rodam diretamente em um PC com Windows sem precisar de uma biblioteca de runtime como .NET Framework ou Java. Cada executável Delphi é um conjunto de instruções em código de máquina que rodam nativamente na CPU, ao contrário de aplicações .NET ou Java que requerem um tradutor para converter opcodes em código de máquina da CPU primeiro. Aqui focamos nas diferenças de gerenciamento de memória entre aplicações nativas Delphi e plataformas de código gerenciado como .NET e Java.

Frameworks como .NET e Java incluem gerenciadores de memória sofisticados com coletores de lixo embutidos. Um coletor de lixo gerencia automaticamente o tempo de vida dos objetos: você cria objetos e o runtime os destrói quando não são mais necessários. Isso reduz o ônus do desenvolvedor de gerenciar memória manualmente.

Delphi não possui um coletor de lixo completo. Desenvolvedores devem se responsabilizar por destruir objetos que criam dinamicamente no código. Delphi fornece mecanismos limitados de descarte automático (por exemplo, contagem automática de referências usada com Interfaces), mas estes não são um substituto completo para um coletor de lixo. Você não precisa gerenciar objetos criados em tempo de design (forms, frames, data modules, components, controls), mas deve gerenciar objetos criados dinamicamente.

circle-exclamation

Ao portar ou desenvolver aplicações do lado do servidor (web), assegure-se de que o código legado VCL esteja livre de vazamentos de memória. Em Delphi você pode ativar o relatório de vazamentos facilmente adicionando uma única linha ao arquivo do projeto, por exemplo:

Project source
begin

{$ifdef UNIGUI_VCL}

// add this line to report memory leaks
ReportMemoryLeaksOnShutdown := True;

Application.Initialize;

TUniServerModule.Create(Application);

Application.Run;

{$endif}

end.

Para informações mais detalhadas sobre problemas de memória e métodos de depuração/detecção, veja: Using FastMM in Full Debug Modearrow-up-right.