Aprenda a liberar os objetos da memória Delphi Maracanaú, Ceará

Conheça três métodos para liberar os objetos da memória. Esse conteúdo é recomendado para desenvolvedores Delphi. A descrição das etapas são simples e acompanhadas de ilustrações.

Rosa MH Cordeiro
(85) 341-1170
r Cap Manuel Bandeira, 250
Maracanaú, Ceará
 
Salão Unissex Iracema
(85) 384-1700
r 72, 865
Maracanaú, Ceará
 
Nelson L Lopes
(85) 341-0737
pc João Leite, 296
Maracanaú, Ceará
 
Raimunda Oa Laurindo
(85) 371-2284
av IV, Jereissati I
Maracanaú, Ceará
 
Vanderlei F Paz
(85) 341-3665
r Afro Campos, 389
Maracanaú, Ceará
 
Luiz Azevedo Nascimento Cabeleireiro
(85) 382-1252
av Vii, Jereissati I
Maracanaú, Ceará
 
Galba L Lopes
(85) 384-1706
r 0019, 703, lj 2, Santa Maria
Maracanaú, Ceará
 

Aprenda a liberar os objetos da memória Delphi

Liberando objetos da memória
Há uma dúvida muito comum que vejo entre os desenvolvedores Delphi, noque diz respeito à liberação de objetos da memória. Eu mesmo já tivealguns problemas com isso, e a intenção deste artigo é exatamentecompartilhar com vocês essa experiência para evitar que tenhamproblemas devido à má liberação dos objetos da memória.

Temos 3 possibilidades para liberar objetos da memória.

1 – Destroy – Executa o destrutor da classe, liberando o objeto damemória, porém não remove a referência do objeto ao endereço de memória.
Isso pode ser constatado ao verificarmos a referencia do objeto emdebug, veremos que ele continua fazendo referência a uma posição dememória, inclusive, se dermos outro destroy em seguida, ganhamos um“Acess Violation” de brinde do delphi.

Vamos tentar exemplificar com código. Por exemplo, se tivermos oseguinte contexto, um objeto do tipo Funcionário declarado na seçãoprivate do form. Antes de criarmos este objeto, verificamos se o mesmojá está criado, para então criarmos ele e alimentarmos com algunsvalores, após isso, nós exibimos o nome do funcionário em umShowMessage para então destruirmos o objeto.

 figura1.JPG

Na primeira vez que executarmos este bloco de código, o funcionárioserá igual a nil, então entrará na condição not(Assigned(Funcionario)),criaremos o funcionário e alimentaremos com os valores padrões. Apósisso, o showmessage será executado exibindo o nome do funcionário elogo em seguida o objeto será destruído. Porém, se executarmos estebloco pela segunda vez, a condição not(Assigned(Funcionario)) não serásatisfeita, pois Funcionario continuará com a referência ao endereço dememória, com isso ao executarmos o ShowMessage ganharemos umAccessViolation.

2 – Free – Verifica se o objeto é nil e caso seja, executa o destroy doobjeto. Neste caso, o objeto também permanece com a referência àposição de memória, porém ele verifica se o objeto é nil antes deexecutar o destroy, tornando-o um pouco mais eficiente do que o Destroy.

No caso do Free, mesmo ele sendo mais eficiente do que o destroy,teríamos o mesmo problema do AccessViolation, pois o free também não seencarrega de atribuir nil ao objeto após a destruição do mesmo. Paranão termos o Access violation e conseguirmos recriar o objetoFuncionario teríamos que alterar a forma de liberação do objeto para:

    Funcionário.free;
    Funcionário := nil;

    Com isso, na próxima vez, a condição not(Assigned(Funcionario))será satisfeita e o objeto será recriado, assim não causaráAccessViolation ao executar o ShowMessage;
    Lembrando que esta forma (atribuindo nil explicitamente) também funcionaria com o destroy.

3 – FreeAndNil – Este é o mais eficiente, ele executa o free do objetopassado como parâmetro e em seguida remove a referência do mesmo aoendereço de memória do objeto, atribuindo nil ao objeto, com isso, casoseja executado novamente o FreeAndNil no objeto, não receberemosnenhuma mensagem de erro, pois ele executará o free , que por sua vezverificará se o objeto é diferente de nil e somente se for é queexecutará o destroy, e após isso, atribuirá nil ao objeto em questão.

    Com o FreeAndNil, não precisamos atribuir explicitamente o nil aoobjeto funcionário, pois o próprio método já se encarrega disso. Dessaforma a liberação do objeto ficaria assim:

    FreeAndNil(Funcionario);

Desta forma, ao executar o bloco de código da figura 1 pela segundavez, a condição condição not(Assigned(Funcionario)) será satisfeita,pois o objeto será nil, e então criaremos novamente o objeto,alimentaremos os valores e a execução prosseguirá com sucesso.

Temos apenas que tomar um cuidado especial ao usar o Free e oFreeAndNil. Como foi dito, no fim das contas, ambos chamam o métodoDestrutor do objeto, porém, caso seu objeto tenha um destrutordiferente do padrão, é fundamental que o mesmo esteja com a diretivaoverride, pois senão, ao executar o free, será executado apenas odestroy default do TObject. Por exemplo, imagine que tenhamos aseguinte declaração da classe TFuncionario.

figura2.JPG
 
E a seguinte implementação no método destroy:

 
figura3.JPG

Nesse caso, se utilizarmos Funcionário.destroy, receberemos umshowMessage com a mensagem informando que executou o destructor  doTFuncionario(pois executamos o destroy diretamente da classe concretaTFuncionario), porém se utilizarmos o Free ou o FreeAndNil veremos quea mensagem não será exibida, isto porque o destructor que foi executadofoi da classe TObject e não da TFuncionario.

Agora, se alterar a assinatura do método, incluindo override, ahistória muda. Mesmo se executarmos o Free ou o FreeAndNil, receberemosao mensagem informando que o  destructor executado foi da TFuncionariopois sobrescrevemos o método destroy (que é virtual na classe TObject).

Sabendo-se destas diferenças e tomando os devidos cuidados, tenhocerteza que serão evitados muitos access violations aparentemente“misteriosos” em suas aplicações.

Bom pessoal, este foi um artigo breve, explicando as principaisdiferenças e cuidados básicos ao se liberar objetos da memória noDelphi, espero que tenham gostado, até a próxima.

Clique aqui para ler este artigo na DevMedia