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:
Não chama o método objeto.destroy;
#tenso; Alguém aqui já passou por isso?
abracos
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
Curtir tópico
+ 0
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
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
Responder
Gostei + 1
Mais Posts
03/07/2017
Emerson Nascimento
boa tarde people td bom?
Acabei de descobrir que o código abaixo:
Não chama o método objeto.destroy;
#tenso; Alguém aqui já passou por isso?
abracos
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
Clique aqui para fazer login e interagir na Comunidade :)