[delphi] FreeAndNil não chama o destrutor da classe Help
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
Curtidas 0
Melhor post
Natanael Ferreira
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
GOSTEI 1
Mais Respostas
Emerson Nascimento
28/06/2017
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)
GOSTEI 0