Destructor

Un destructor este o  metodă de clasă specială care servește la deinițializarea unui obiect (de exemplu, eliberarea memoriei ).

Sintaxa destructorului

Destructor în Delphi

Cuvântul cheie Delphi este folosit pentru a declara un destructor destructor. Numele destructorului poate fi orice, dar este recomandat să-l numiți întotdeauna pe destructor Destroy.

TClassWithDestructor = destructor de clasă Distruge ; suprascrie ; sfârşitul ;

În Delphi, toate clasele sunt descendente cel puțin ai clasei TObject , prin urmare, pentru a dealoca corect memoria, este necesar să suprascrieți destructorul folosind override.

În Delphi, un apel direct destructor este rar folosit. Metoda este folosită în schimb Free.

MyObject.Free;

Metoda Freeverifică mai întâi dacă obiectul care este distrus există, apoi apelează destructorul. Această tehnică vă permite să evitați erorile care apar la accesarea unui obiect inexistent.

Destructor în C++

#include <iostream> folosind namespace std ; clasa NameOfClass { privat : int a ; public : NameOfClass ( int m ); ~ NameOfClass (); }; NameOfClass ::~ NameOfClass () { cout << this -> a << endl ; } NameOfClass :: NameOfClass ( int m ) { a = m _ }

~NameOfClass() — destructor, are numele ~NameOfClass, nu are parametri de intrare.

În acest caz, când obiectul este distrus, acesta trimite parametrul în consolă a.

Destructorul din Rust

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

În blocul implpentru structura Foo, este implementată metoda trăsăturii cu același nume Drop[4] . Codul de mai jos creează o variabilă foo. Datorită modelului de memorie inteligentă, destructorul va fi apelat automat și fără overhead de îndată ce domeniul de aplicare al variabilei se termină.

let foo = Foo :: new ( 42 );

Destructor virtual

Destructorul de interfețe sau clase abstracte este de obicei făcut virtual . Această tehnică vă permite să ștergeți corect fără pierderi de memorie, având doar un pointer către clasa de bază [5] .

Fie că (în C++) există un tip Fatherși un tip derivat din acesta Son:

tatăl de clasă { public : Tatăl () {} ~ Tatăl () {} }; clasa Fiul : Tatăl public { public : int * buffer ; Fiul () : Tatăl () { buffer = new int [ 1024 ]; } ~ Fiul () { șterge [] buffer ; } };

Codul de mai jos este incorect și pierde memorie.

Tată * obiect = nou Fiu (); // Son() se numește ștergere obiect ; // sunând pe ~Tatăl()!!

Cu toate acestea, dacă faceți destructorul Fathervirtual:

tatăl de clasă { public : Tatăl () {} virtual ~ Tată () {} }; clasa Fiul : Tatăl public { privat : int * buffer ; public : Fiul () : Tatăl () { buffer = new int [ 1024 ]; } ~ Fiul () { șterge [] buffer ; } };

apelul delete object;va provoca distrugătorii ~Sonşi ~Father.


Link -uri

  1. Destructori Arhivat 30 august 2019 la Wayback Machine , în documentația online PHP
  2. 3. Model de date - documentația Python 2.7.18 . Preluat la 31 august 2019. Arhivat din original la 19 septembrie 2019.
  3. 3. Model de date - documentația Python 3.9.0 . Preluat la 31 august 2019. Arhivat din original la 26 octombrie 2012.
  4. std::ops::Drop - Rust . doc.rust-lang.org. Consultat la 31 octombrie 2019. Arhivat din original la 29 septembrie 2019.
  5. Serghei Oendarenko. Funcții virtuale și destructor . Data accesului: 1 iulie 2013. Arhivat din original pe 2 august 2013.

Vezi și