Destruktor

En destructor er en speciel klassemetode  , der tjener til at deinitialisere et objekt (for eksempel frigørelse af hukommelse ).

Destruktorsyntaks

Destructor i Delphi

Delphi nøgleordet bruges til at erklære en destruktor destructor. Navnet på destruktoren kan være hvad som helst, men det anbefales altid at navngive destructoren Destroy.

TClassWithDestructor = klassedestruktor Destroy ; _ tilsidesætte ; ende ;

I Delphi er alle klasser efterkommere af mindst TObject -klassen , derfor er det nødvendigt at tilsidesætte destruktoren ved hjælp af override.

I Delphi bruges et direkte destruktoropkald sjældent. Metoden bruges i stedet Free.

MyObject.Free;

Metoden Freekontrollerer først, om objektet, der ødelægges, eksisterer, og kalder derefter destruktoren. Denne teknik giver dig mulighed for at undgå fejl, der opstår, når du får adgang til et ikke-eksisterende objekt.

Destructor i C++

#include <iostream> bruger navneområde std ; klasse NameOfClass { privat : int a ; offentligt : NameOfClass ( int m ); ~ NameOfClass (); }; NameOfClass ::~ NameOfClass () { cout << dette -> a << endl ; } NameOfClass :: NameOfClass ( int m ) { a = m _ }

~NameOfClass() — destructor, har navnet ~NameOfClass, har ingen inputparametre.

I dette tilfælde, når objektet er ødelagt, udsender det parameteren til konsollen a.

Destruktoren i Rust

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

I blokken implfor strukturen Fooer trækmetoden af ​​samme navn implementeret Drop[4] . Koden nedenfor opretter en variabel foo. Takket være den smarte hukommelsesmodel kaldes destruktoren automatisk og uden overhead, så snart omfanget af variablen slutter.

lad foo = Foo :: ny ( 42 );

Virtual destructor

Destruktoren af ​​grænseflader eller abstrakte klasser er normalt lavet virtuel . Denne teknik giver dig mulighed for at slette korrekt uden hukommelseslækager, idet du kun har en pointer til basisklassen [5] .

Lad (i C++) der er en type Fatherog en type afledt af den Son:

klasse far { offentligt : Far () {} ~ Far () {} }; klasse Søn : offentlig Fader { offentligt : int * buffer ; Søn () : Far () { buffer = new int [ 1024 ]; } ~ Son () { slet [] buffer ; } };

Koden nedenfor er forkert og lækker hukommelse.

Fader * objekt = ny Søn (); // Son() kaldes delete object ; // kalder ~Far()!!

Men hvis du gør destruktoren Fathervirtuel:

klasse far { offentligt : Far () {} virtuel ~ Far () {} }; klasse Søn : offentlig Fader { privat : int * buffer ; offentligt : Søn () : Far () { buffer = new int [ 1024 ]; } ~ Son () { slet [] buffer ; } };

opkaldet delete object;vil forårsage ødelæggerne ~Sonog ~Father.


Links

  1. Destructors Arkiveret 30. august 2019 på Wayback Machine , i online PHP-dokumentationen
  2. 3. Datamodel - Python 2.7.18 dokumentation . Hentet 31. august 2019. Arkiveret fra originalen 19. september 2019.
  3. 3. Datamodel - Python 3.9.0 dokumentation . Hentet 31. august 2019. Arkiveret fra originalen 26. oktober 2012.
  4. std::ops::Drop - Rust . doc.rust-lang.org. Hentet 31. oktober 2019. Arkiveret fra originalen 29. september 2019.
  5. Sergey Olendarenko. Virtuelle funktioner og destruktor . Dato for adgang: 1. juli 2013. Arkiveret fra originalen 2. august 2013.

Se også