Jump to content

Diretivas virtual e override do Delphi - Evitando vazamentos de memória


Postagens Recomendadas

  • Administradores

Tópico originalmente criado por: @Jonathan Santos

ecentemente encontrei um problema de Memory Leak  em uma aplicação, devido a causa do problema estou fazendo este post para evitar esse tipo de erro.

No Delphi a diretiva virtual permite que seu método seja sobrescrito com o mesmo nome, ou seja, em uma subclasse você pode reescrever um método de acordo com suas necessidades.

Ja a diretiva override significa que o método esta sobrescrevendo o método original, então na frase acima o método sobrescrito deve conter a diretiva override , e o método original a diretiva virtual .

Um erro simples de esquecer uma dessas diretivas pode acontece de ao dar .Free em uma classe não chamar o destructor , ocasionando na não liberação de memória de alguns objetos.

Exemplo:

  1. Abaixo temos a classe TRetornoWebService , nessa classe declaramos que o Create pode ser sobrescrito por uma subclasse, e o Destroy está sendo reescrito, pois, a classe TObject do delphi já possui um virtual em seu Destroy .

  2. 77149fc9573cdf61ee36ae945d3918a701ea69d1.png.b5e76ab127a78d37a33aec5902da1b63.png

  3. Agora na subclasse TRetornoConsultaNFe , que é “filha” da TRetornoWebService , sobreescrevemos o Create e o Destroy das classes ancestrais, nesse caso não foi necessário adicionar o virtual no Destroy da TRetornoWebService, pois, a TObject já possuí um Destroy declarado com virtual.

  4. 58c4ea0bdd1b89ffc52f70214f6ae0fd117af3fd.png.3af86aa13344cf4ff0bd937c205ed0d6.png

  5. Na imagem acima o inherited 2 chama o método original da classe pai após realizar as chamadas acima dele.

Algumas outras diretivas:

virtual  - Usado para definir um método que pode ser sobrescrito.

override  - Utilizado para definir um método que está sobrescrevendo um método virtual.

abstract  - É usado com virtual ou override para definir um método sem implementação que deve ser sobrescrito na subclasse, senão o mesmo não será chamado.

final - Usado com virtual ou override para definir um método que não pode ser sobrescrito.

reintroduce  - É como o override, porem, funciona com métodos não dinamicos e não virtuais. Utilizado se você quiser reintroduzir um método e comunicar para o compilador que você não cometeu um engano escrevendo um método com mesmo nome da classe pai.

overload  - Essa diretiva permite que você declare um método com mesmo nome, porem, com parâmetros diferentes.

 

Link to comment
Compartilhe em outros sites

  • 1 year later...

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...