Destruktor (počítačové programování) - Destructor (computer programming)
v objektově orientované programování, a destruktor (někdy zkráceno dtor[1]) je metoda který je vyvolán mechanicky těsně před vzpomínkou na objekt je vydáno.[2] Může se to stát, když je život je vázán rozsah a provedení opustí obor, když je vložen do jiného objektu, jehož životnost končí, nebo když byl přiděleno dynamicky a je vydán výslovně. Jeho hlavním účelem je osvobodit zdroje (přidělení paměti, otevřené soubory nebo zásuvky, připojení k databázi, zámky zdrojů atd.), které objekt získal během své životnosti nebo odhlásil z registrace jiné entity, které si na něj mohou ponechat odkazy. Pro proces je nutné použít destruktory Akvizice zdrojů je inicializace (RAII).
U většiny druhů automatický sběr odpadu U algoritmů může dojít k uvolnění paměti dlouho poté, co se objekt stane nedosažitelným, což způsobí destruktory (tzv finalizátory v tomto případě) nevhodné pro většinu účelů. V takových jazycích se uvolňování zdrojů provádí buď pomocí lexikálního konstruktu (například try..pakdy, Pythonova „s“ nebo Java „try-with-resources“), což je ekvivalent k RAII, nebo explicitně voláním funkce (ekvivalent k výslovnému odstranění); používá zejména mnoho objektově orientovaných jazyků vzor Dispose.
Syntaxe destruktoru
- C ++: destruktory mají stejný název jako třída, se kterou jsou spojeny, ale s a vlkodlak (~) předpona.[2]
- D: destruktory jsou deklarovány jménem
~ toto ()
(vzhledem k tomu, že konstruktory jsou deklarovány pomocítento()
). - Objekt Pascal: destruktory mají klíčové slovo
destruktor
a mohou mít uživatelsky definované názvy, ale většinou jsou pojmenoványZničit
. - Cíl-C: metoda destruktoru má název
dealloc
. - Perl: metoda destruktoru má název
ZNIČIT
; v Rozšíření systému objektů Moose, jmenuje seSTRHNOUT
. - PHP: V PHP 5+ má metoda destruktoru název
__zničit
. V předchozích verzích PHP nebyly žádné destruktory.[3] - Krajta: existují
__del__
metody zvané destruktory podle průvodce jazykem Python 2,[4] ale ve skutečnosti jsou finalizátory jak potvrzuje Python 3.[5] - Rychlý: metoda destruktoru má název
deinit
.
V C ++
Destruktor má stejný název jako třída, ale s a vlkodlak (~) před ním.[2] Například třída s názvem foo bude mít destruktor ~foo()
. Destruktory navíc nemají ani parametry, ani návratové typy.[2] Jak je uvedeno výše, destruktor pro objekt je volán vždy, když končí životnost objektu.[2] Pokud byl objekt vytvořen jako automatická proměnná, jeho životnost končí a destruktor je volán automaticky, když objekt vyjde z rozsahu. Protože C ++ nemá uvolňování paměti, pokud byl objekt vytvořen pomocí
prohlášení (dynamicky na halda ), pak se jeho destruktor zavolá, když Nový
operátor je aplikován na ukazatel na objekt. K této operaci obvykle dochází v jiném destruktoru, obvykle v destruktoru a inteligentní ukazatel objekt.vymazat
V hierarchiích dědičnosti je deklarace a virtuální destruktor v základní třídě zajišťuje, že destruktory odvozených tříd jsou vyvolány správně, když je objekt odstraněn prostřednictvím ukazatele na základní třídu. Objekty, které lze tímto způsobem odstranit, musí zdědit virtuální destruktor.
Destruktor by nikdy neměl vyvolat výjimku.[6]
Příklad
#zahrnout <cstring>#zahrnout <iostream>třída Foo {veřejnost: Foo(): data_(Nový char[velikost("Ahoj světe!")]) { std::strcpy(data_, "Ahoj světe!"); } Foo(konst Foo& jiný) = vymazat; // zakázat konstrukci kopírování Foo& operátor=(konst Foo& jiný) = vymazat; // zakázat přiřazení ~Foo(prázdnota) { vymazat[] data_; }soukromé: příteli std::ostream& operátor<<(std::ostream& os, konst Foo& foo) { os << foo.data_; vrátit se os; } char* data_;};int hlavní() { Foo foo; std::cout << foo << std::konec;}
Objekty, které nelze bezpečně zkopírovat a / nebo přiřadit, by měly být zakázány z takové sémantiky deklarováním jejich odpovídajících funkcí jako odstraněných v rámci veřejné úrovně zapouzdření. Podrobný popis této metody najdete v Scott Meyers 'populární kniha, Efektivní moderní C ++ (Položka 11: „Upřednostnit odstraněné funkce před soukromými nedefinovanými.“)[7]).
V C s příponami GCC
The Sbírka překladačů GNU je C kompilátor přichází se 2 rozšířeními, které umožňují implementaci destruktorů:
- The
destruktor
atribut funkce[8] umožňuje definovat globální prioritní funkce destruktoru: kdyžhlavní()
vrátí, jsou tyto funkce volány v pořadí priority před ukončením procesu. Viz také: Hackování umění vykořisťování.[9] - The vyčištění variabilní atribut umožňuje připojení funkce destruktoru k proměnné: funkce je volána, když proměnná zmizí z rozsahu.
Xojo
Destruktory v Xojo (REALbasic) může být v jedné ze dvou forem. Každý formulář používá deklaraci běžné metody se zvláštním názvem (bez parametrů a bez návratové hodnoty). Starší formulář používá stejný název jako Třída s předponou ~ (vlnovka). Novější formulář používá název Destruktor
. Novější forma je upřednostňována, protože vytváří refaktorování třída jednodušší.
Třída Foobar // Starý formulář Sub ~ Foobar () End Sub // Nový formulář Sub Destructor () End SubEnd Třída
Viz také
Reference
- ^ "dtor". TheFreeDictionary.com. Citováno 2018-10-14.
- ^ A b C d E Sebesta, Robert W. (2012). ""11.4.2.3 Konstruktéři a ničitelé"". Koncepty programovacích jazyků (tisk) (10. vydání). Boston, MA, USA: Addison-Wesley. str. 487. ISBN 978-0-13-139531-2.
- ^ Konstruktéři a ničitelé, z online dokumentace PHP
- ^ https://docs.python.org/2/reference/datamodel.html#object.__del__
- ^ https://docs.python.org/3/reference/datamodel.html#object.__del__
- ^ GotW # 47: Nezachycené výjimky Přístupné 31. července 2011.
- ^ Scott Meyers: Efektivní moderní C ++O'REILLY, ISBN 9781491903995
- ^ C Atribut funkce „destruktor“
- ^ Erickson, Jon (2008). Hackování umění vykořisťování. Žádný lis na škrob. ISBN 1-59327-144-1.