2015-05-28 16 views
5

Co jest nie tak z tym kodem:Destructor bez dyrektywy override

type 
    TobjAvisos = class 

     public 
      constructor Create; 
      destructor Free; 


    end; 

implementation 


constructor TobjAvisos.Create; 
Begin 
    inherited Create; 

end; 

destructor TobjAvisos.Free; 
begin 
    inherited Destroy; 

end; 

To kompiluje bez ostrzeżenia, ale FixInsight zwraca ostrzeżenie: „W522 Destructor bez dyrektywy override”

Odpowiedz

11

Problemem jest to, że ciebie mają zastąpić wirtualny destruktor Destroy. Ten wirtualny destruktor jest nazywany przez nie-wirtualną metodę Free.

W obecnej wersji jedynym sposobem na zniszczenie klasy jest bezpośrednie wywołanie destruktora. Oczekuje się, że klasy Delphi będą niszczone za pomocą metody Free.

Twoja klasa powinna być tak:

type 
    TobjAvisos = class 
    public 
    constructor Create; 
    destructor Destroy; override; 
    end; 

Zastępowanie destruktor wirtualny Destroy jest jedynym sposobem, aby uczynić swoją pracę klasy poprawnie metodą Free.

Obecnie istnieją dwa główne powody korzystania destruktora wirtualny Destroy i wspieranie Free:

  1. Free śmiało można nazwać na odniesienie nil obiektu. Destruktor nie może. Ma to zasadnicze znaczenie dla mechanizmu konstrukcji obiektu do obsługi wyjątków.
  2. Obsługa obiektu Free umożliwia bezpieczne niszczenie obiektu, nawet jeśli typ obiektu czasu jest bardziej wyprowadzony niż typ czasu kompilacji odwołania do obiektu.

Niektóre użyteczne odczyt na tematy pokrewne można znaleźć tutaj: Why should I not use "if Assigned()" before using or freeing things?

+0

miałem zamiar odwołać moje stare pytanie, a potem widziałem już to zrobiłeś :-) –

+0

@David. Więc tworzę moją klasę, o której wspomniałeś w swojej odpowiedzi z Destroy, ale nadal mogę zadzwonić do .Free, a klasa i poprawnie "uwolnić" i zwolnić pamięć? – Jlouro

+0

Tak. Autor klasy przesłania 'Destroy' i implementuje niezbędny kod destruktora w tym nadpisanym destruktorze. Konsumenci klasy nazywają nie-wirtualną metodą "Free". Zobacz odpowiedź, do której link się po szczegóły. –