Tuhoaja

Destruktori on erikoisluokkamenetelmä , jonka avulla  objektin alustus poistetaan (esimerkiksi muistin vapauttaminen ).

Destructor syntaksi

Destructor Delphissä

Delphi - avainsanaa käytetään ilmoittamaan tuhoaja destructor. Hävittäjän nimi voi olla mikä tahansa, mutta on suositeltavaa aina nimetä tuhoaja Destroy.

TClassWithDestructor = luokan tuhoaja Destroy ; ohittaa ; loppu ;

Delphissä kaikki luokat ovat vähintään TObject -luokan jälkeläisiä , joten muistin asianmukaisen vapauttamiseksi on välttämätöntä ohittaa tuhoaja käyttämällä override.

Delphissä suoraa tuhoajakutsua käytetään harvoin. Sen sijaan käytetään menetelmää Free.

OmaObject.Free;

Menetelmä Freetarkistaa ensin, onko tuhottava objekti olemassa, ja kutsuu sitten tuhoajan. Tämän tekniikan avulla voit välttää virheet, jotka tapahtuvat käytettäessä olematonta objektia.

Destructor C++:ssa

#include <iostream> käyttäen nimiavaruutta std ; luokka NameOfClass { yksityinen : int a ; julkinen : NameOfClass ( int m ); ~ NameOfClass (); }; NameOfClass ::~ NameOfClass () { cout << tämä -> a << endl ; } NameOfClass :: NameOfClass ( int m ) { a = m _ }

~NameOfClass() — destructor, jolla on nimi ~NameOfClass, ei ole syöttöparametreja.

Tässä tapauksessa, kun objekti tuhoutuu, se tulostaa parametrin konsoliin a.

The Destructor in Rust

struct Foo { minä : i32 , } impl Foo { fn uusi ( i : i32 ) -> Foo { Foo { minä } } } impl Drop for Foo { fn drop ( & mut self ) { println! ( "{}" , itse . i ); } }

implRakenteen lohkossa Fooon toteutettu samanniminen piirremenetelmä Drop[4] . Alla oleva koodi luo muuttujan foo. Älykkään muistimallin ansiosta tuhoaja kutsutaan automaattisesti ja ilman lisäkustannuksia heti, kun muuttujan laajuus päättyy.

anna foo = Foo :: uusi ( 42 );

Virtual Destructor

Liitäntöjen tai abstraktien luokkien tuhoaja tehdään yleensä virtuaaliseksi . Tämän tekniikan avulla voit poistaa oikein ilman muistivuotoja, kun on vain osoitin perusluokkaan [5] .

Olkoon (C++:ssa) olemassa tyyppi Fatherja siitä johdettu tyyppi Son:

luokan isä { julkinen : Isä () {} ~ Isä () {} }; luokan Poika : julkinen Isä { julkinen : int * puskuri ; Poika () : Isä () { puskuri = uusi int [ 1024 ]; } ~ Poika () { poista [] puskuri ; } };

Alla oleva koodi on virheellinen ja vuotaa muistia.

Isä * esine = uusi Poika (); // Son() on nimeltään delete object ; // kutsuu ~Isä()!!

Jos kuitenkin teet destructorista Fathervirtuaalisen:

luokan isä { julkinen : Isä () {} virtuaalinen ~ Isä () {} }; luokan Poika : julkinen Isä { yksityinen : int * puskuri ; julkinen : Poika () : Isä () { puskuri = uusi int [ 1024 ]; } ~ Poika () { poista [] puskuri ; } };

kutsu delete object;aiheuttaa tuhoajia ~Sonja ~Father.


Linkit

  1. Destructors arkistoitu 30. elokuuta 2019 Wayback Machinessa , online PHP - dokumentaatiossa
  2. 3. Tietomalli - Python 2.7.18 -dokumentaatio . Haettu 31. elokuuta 2019. Arkistoitu alkuperäisestä 19. syyskuuta 2019.
  3. 3. Tietomalli - Python 3.9.0 -dokumentaatio . Haettu 31. elokuuta 2019. Arkistoitu alkuperäisestä 26. lokakuuta 2012.
  4. std::ops::Drop - Ruoste . doc.rust-lang.org. Haettu 31. lokakuuta 2019. Arkistoitu alkuperäisestä 29. syyskuuta 2019.
  5. Sergei Olendarenko. Virtuaalifunktiot ja tuhoaja . Käyttöönottopäivä: 1. heinäkuuta 2013. Arkistoitu alkuperäisestä 2. elokuuta 2013.

Katso myös