Destruktor

Destruktor je speciální  metoda třídy , která slouží k deinicializaci objektu (například k uvolnění paměti ).

Syntaxe destruktoru

Destruktor v Delphi

Klíčové slovo Delphi se používá k deklaraci destruktoru destructor. Název destruktoru může být jakýkoli, ale doporučuje se vždy pojmenovat destruktor Destroy.

TClassWithDestructor = destruktor třídy Destroy ; přepsat ; konec ;

V Delphi jsou všechny třídy potomky alespoň třídy TObject , proto, aby bylo možné správně uvolnit paměť, je nutné přepsat destruktor pomocí override.

V Delphi se přímé volání destruktoru používá jen zřídka. Místo toho se používá metoda Free.

MyObject.Free;

Metoda Freenejprve zkontroluje, zda ničený objekt existuje, a poté zavolá destruktor. Tato technika umožňuje vyhnout se chybám, ke kterým dochází při přístupu k neexistujícímu objektu.

Destruktor v C++

#include <iostream> pomocí jmenného prostoru std ; třída NameOfClass { soukromý : int a ; veřejnost : NameOfClass ( int m ); ~ NameOfClass (); }; NameOfClass ::~ NameOfClass () { cout << this -> a << endl ; } NameOfClass :: NameOfClass ( int m ) { a = m _ }

~NameOfClass() — destruktor, má jméno ~NameOfClass, nemá žádné vstupní parametry.

V tomto případě, když je objekt zničen, odešle parametr do konzole a.

Destruktor v Rustu

struct Foo { : i32 , } impl Foo { fn new ( i : i32 ) -> Foo { Foo { i } } } impl Drop for Foo { fn drop ( & mut self ) { println! ( "{}" , vlastní . i ); } }

V bloku implpro strukturu Fooje implementována stejnojmenná metoda vlastností Drop[4] . Níže uvedený kód vytvoří proměnnou foo. Díky modelu chytré paměti bude destruktor zavolán automaticky a bez režie, jakmile skončí rozsah proměnné.

let foo = Foo :: new ( 42 );

Virtuální destruktor

Destruktor rozhraní nebo abstraktní třídy je obvykle virtuální . Tato technika vám umožňuje správně mazat bez úniku paměti, má pouze ukazatel na základní třídu [5] .

Nechť (v C++) existuje typ Fathera od něj odvozený typ Son:

třída Otec { veřejnost : Otec () {} ~ Otec () {} }; třída Syn : veřejný Otec { veřejnost : int * buffer ; Syn () : Otec () { buffer = new int [ 1024 ]; } ~ Son () { delete [] buffer ; } };

Níže uvedený kód je nesprávný a dochází k úniku paměti.

Otec * objekt = nový Syn (); // Son() se nazývá delete object ; // volání ~Otec()!!

Pokud však destruktor změníte na Fathervirtuální:

třída Otec { veřejnost : Otec () {} virtuální ~ Otec () {} }; třída Syn : veřejný Otec { soukromý : int * buffer ; veřejnost : Syn () : Otec () { buffer = new int [ 1024 ]; } ~ Son () { delete [] buffer ; } };

volání delete object;způsobí destruktory ~Sona ~Father.


Odkazy

  1. Destruktory archivovány 30. srpna 2019 na Wayback Machine v online dokumentaci PHP
  2. 3. Datový model - dokumentace Pythonu 2.7.18 . Získáno 31. srpna 2019. Archivováno z originálu 19. září 2019.
  3. 3. Datový model – dokumentace Pythonu 3.9.0 . Získáno 31. srpna 2019. Archivováno z originálu dne 26. října 2012.
  4. std::ops::Drop - Rust . doc.rust-lang.org. Získáno 31. října 2019. Archivováno z originálu dne 29. září 2019.
  5. Sergej Olendarenko. Virtuální funkce a destruktor . Datum přístupu: 1. července 2013. Archivováno z originálu 2. srpna 2013.

Viz také