Destructor (programowanie komputerowe) - Destructor (computer programming)
W programowaniu obiektowym , o destructor (czasami w skrócie dtor ) to metoda , która jest wywoływana tuż przed mechanicznie pamięć o obiekcie zostanie zwolniony. Może się to zdarzyć, gdy jego okres istnienia jest powiązany z zakresem, a wykonanie opuszcza zakres, gdy jest osadzony w innym obiekcie, którego okres istnienia się kończy, lub gdy został przydzielony dynamicznie i jest jawnie wydany. Jego głównym celem jest zwolnienie zasobów (alokacje pamięci, otwarte pliki lub gniazda, połączenia z bazą danych , blokady zasobów itp.), Które zostały nabyte przez obiekt w trakcie jego życia i / lub wyrejestrowanie z innych podmiotów, które mogą zachować do niego odniesienia. Do procesu pozyskiwania zasobów jest inicjalizacja (RAII) konieczne jest użycie destruktorów .
W przypadku większości rodzajów algorytmów automatycznego usuwania elementów bezużytecznych zwolnienie pamięci może nastąpić długo po tym, jak obiekt stanie się nieosiągalny, co powoduje, że destruktory (zwane w tym przypadku finalizatorami ) nie nadają się do większości zastosowań. W takich językach zwalnianie zasobów odbywa się za pomocą konstrukcji leksykalnej (takiej jak try..finally, Python „with” lub Java's „try-with-resources”), która jest odpowiednikiem RAII, lub jawnie przez wywołanie funkcja (odpowiednik jawnego usunięcia); w szczególności wiele języków zorientowanych obiektowo używa wzorca Dispose .
Składnia destruktora
- C ++ : destruktory mają taką samą nazwę jak klasa, z którą są skojarzone, ale z przedrostkiem tyldy (~).
-
D : destruktory są deklarowane z nazwą
~this()
(podczas gdy konstruktory są deklarowane za pomocąthis()
). -
Object Pascal : destruktory mają słowo kluczowe
destructor
i mogą mieć nazwy zdefiniowane przez użytkownika, ale w większości są nazwaneDestroy
. -
Cel-C : metoda destruktora ma nazwę
dealloc
. -
Perl : metoda destruktora ma nazwę
DESTROY
; w rozszerzeniu systemu obiektów Moose nazywa sięDEMOLISH
. -
PHP : W PHP 5+ metoda destruktora ma nazwę
__destruct
. We wcześniejszych wersjach PHP nie było destruktorów. -
Python : istnieją
__del__
metody zwane destruktorami w przewodniku po języku Python 2, ale w rzeczywistości są one finalizatorami, co zostało potwierdzone w Pythonie 3. -
Rust : metoda destruktora rdzy ma swoją nazwę
drop
-
Swift : metoda destruktora ma swoją nazwę
deinit
.
W C ++
Destruktor ma taką samą nazwę jak klasa, ale przed nią znajduje się tylda (~). Na przykład klasa o nazwie foo będzie miała destruktor . Ponadto destruktory nie mają parametrów ani typów zwracanych. Jak wspomniano powyżej, destruktor obiektu jest wywoływany za każdym razem, gdy kończy się jego żywotność. Jeśli obiekt został utworzony jako zmienna automatyczna , jego żywotność kończy się, a destruktor jest wywoływany automatycznie, gdy obiekt znajdzie się poza zasięgiem. Ponieważ C ++ nie ma czyszczenia pamięci, jeśli obiekt został utworzony za pomocą instrukcji (dynamicznie na stercie ), wówczas jego destruktor jest wywoływany, gdy operator jest stosowany do wskaźnika do obiektu. Zwykle ta operacja zachodzi w innym destruktorze, zwykle w destruktorze inteligentnego obiektu wskaźnika .
~foo()
new
delete
W hierarchiach dziedziczenia deklaracja wirtualnego destruktora w klasie bazowej zapewnia, że destruktory klas pochodnych są wywoływane prawidłowo, gdy obiekt jest usuwany za pomocą wskaźnika do klasy bazowej. Obiekty, które mogą zostać w ten sposób usunięte, muszą dziedziczyć wirtualny destruktor.
Destruktor nigdy nie powinien zgłaszać wyjątku.
Przykład
#include <cstring>
#include <iostream>
class Foo {
public:
Foo(): data_(new char[sizeof("Hello, World!")]) {
std::strcpy(data_, "Hello, World!");
}
Foo(const Foo& other) = delete; // disable copy construction
Foo& operator=(const Foo& other) = delete; // disable assignment
~Foo(void) { delete[] data_; }
private:
friend std::ostream& operator<<(std::ostream& os, const Foo& foo) {
os << foo.data_;
return os;
}
char* data_;
};
int main() {
Foo foo;
std::cout << foo << std::endl;
}
Obiekty, których nie można bezpiecznie skopiować i / lub przypisać, należy wyłączyć z takiej semantyki, deklarując ich odpowiednie funkcje jako usunięte na publicznym poziomie hermetyzacji. Szczegółowy opis tej metody można znaleźć w popularnej książce Scotta Meyersa , Effective Modern C ++ (Punkt 11: „Preferuj usunięte funkcje od prywatnych niezdefiniowanych”).
W C z rozszerzeniami GCC
The GNU Compiler Collection „s C kompilator pochodzi z 2 rozszerzeniami, które pozwalają destruktorów wykonawcze:
destructor
Atrybut funkcja umożliwia zdefiniowanie globalnych funkcji z priorytetami destruktor kiedymain()
wraca, te funkcje są wywoływane w kolejności pierwszeństwa przed wygaśnięciem procesowych. Zobacz też: Hakowanie sztuki wyzysku .- Porządki atrybut zmienna umożliwia dołączenie funkcji destructor do zmiennej: funkcja jest wywoływana, gdy zmienna wykracza poza zakres.
Xojo
Destruktory w Xojo (REALbasic) mogą mieć jedną z dwóch form. Każdy formularz używa zwykłej deklaracji metody ze specjalną nazwą (bez parametrów i bez wartości zwracanej). Starsza forma używa tej samej nazwy co Class z prefiksem ~ (tylda). Nowszy formularz używa nazwy Destructor
. Nowsza forma jest preferowana, ponieważ ułatwia refaktoryzację klasy.
Class Foobar // Old form Sub ~Foobar() End Sub // New form Sub Destructor() End Sub End Class