Destruindo objetos e realizando a limpeza de memória

Assim como na linguagem Delphi nativa o scripter também trabalha com os objetos seguindo seu ciclo de vida. Ou seja, fica a cargo do desenvolvedor do script tanto a criação como uso como “destruição” do objeto envolvido, para que o mesmo não fique constando em memória.

Após a criação dos objetos a boa prática é implementar a estrutura de TRY e o FINALLY. Desta forma o compilador irá tentar resolver o que está dentro da cláusula TRY e caso ocorra algum erro, então irá pular diretamente para a cláusula FINALLY e realizar a limpeza da memória para o objeto criado. Caso não ocorram erros durante a execução, a limpeza da memória será executada da mesma forma pela cláusula FINALLY.

Abaixo um exemplo de código propondo a criação de um objeto do tipo TStringList e na sequência a eliminação através do método FREE.

 

uses Classes; // unit que tem a definição da classe TStringList var str : TStringList; //declaração da variável begin str := TStringList.Create; // criação do objeto try str.add('Testando'); //utilização do objeto str.add(' ciclo de vida'); str.add(' de objetos no script.'); ShowMessage(str.Text); finally str.free; //destruição/eliminação do objeto end; end;

 

A falta da chamada ao método FREE resulta no objeto ainda em memória depois da utilização do script e isso pode gerar problemas quanto ao uso de memória pelo software e vazamentos de memória, que podem atrapalhar o uso do software como um todo.

 

Abaixo um exemplo de uma maneira de codificação errada e que acarretará muitos problemas ao software.

uses Classes; // unit que tem a definição da classe TStringList var str : TStringList; //declaração da variável begin str := TStringList.Create; // criação do objeto str.add('Testando'); //utilização do objeto str.add(' ciclo de vida'); str.add(' de objetos no script.'); ShowMessage(str.Text); str.free; //destruição/eliminação do objeto end;

Ao não utilizar a estrutura do TRY e qualquer erro ocorrer entre as linhas 7 e 11, o objeto não será destruído da memória.

Na situação acima, poderão ocorrer duas coisas após acontecer algum erro e a memória não ser liberada:

  1. Ao executar novamente esse código, novos erros irão surgir, como por exemplo, o erro que menciona que o objeto str já está assinado e já existe na memória e que não pode ser criado novamente.

  2. Outra situação com base no exemplo acima, em um método local e não global (acima é global) alocar mais memória a cada vez que gera um erro, e isso vai empilhando mais memória para o mesmo objeto, até que o sistema/software gere novos erros de Out of Memory ou Stack Overflow.

 

Para facilitar ainda mais o entendimento, foi produzido um vídeo sobre este conteúdo. Para acessá-lo, utilize o link abaixo:

Treinamento VsScripter - 5 - Ciclo de Vida do Script