Fórum [delphi] FreeAndNil não chama o destrutor da classe Help #583025

28/06/2017

0

boa tarde people td bom?

Acabei de descobrir que o código abaixo:

if assigned then
  freeandnil(objeto);


Não chama o método objeto.destroy;

#tenso; Alguém aqui já passou por isso?

abracos
Gladstone Matos

Gladstone Matos

Responder

Post mais votado

28/06/2017

Não há problema algum em usar o FreeAndNil, aliás, ele é o mais seguro e indicado ao destruir um objeto.

Diferenças entre Destroy, Free e FreeAndNil:

Destroy:

Executa o destrutor da classe, liberando-o da memória, porém não remove a referência do objeto da memória, ou seja, se você executar o Destroy de um objeto e em seguida consultar se ele está instanciado, a consulta retornará que o objeto ainda existe, e isto poderá causar problemas na sua aplicação.

Free:

Também destrói o objeto, porém antes de chamar o destrutor da classe, o método Free verifica se o objeto não é nil, ou seja, o Free pode prevenir um erro na aplicação e de certa forma é mais seguro do que o Destroy, porém ele também não limpa a referência da memória e resulta no mesmo problema encontrado no Destroy.

FreeAndNil:

É o método mais seguro de ser utilizado, pois ele executa o Free e também atribui nil para o endereço de memória, seria como executar objProduto.Destroy e em seguida objProduto:= nil. Então ao executar o FreeAndNil e depois testar se o objeto está instanciado, o resultado será que o objeto não está instanciado, o que é o correto.

Veja o artigo abaixo para melhor entendimento:
https://htwojsystem.wordpress.com/2011/06/29/destroy-free-e-freeandnil-em-delphi

Natanael Ferreira

Natanael Ferreira
Responder

Gostei + 1

Mais Posts

03/07/2017

Emerson Nascimento

boa tarde people td bom?

Acabei de descobrir que o código abaixo:

if assigned then
  freeandnil(objeto);


Não chama o método objeto.destroy;

#tenso; Alguém aqui já passou por isso?

abracos


acredito que falte algo nesse if. deveria ser: if assigned(objeto)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar