В объектно-ориентированном программировании , A деструктор (иногда сокращенно dtor [1] ) представляет собой метод , который вызывается механически непосредственно перед тем , памятью объекта освобождаются. [2] Это может произойти, когда его время жизни привязано к области видимости, а выполнение покидает область действия, когда он встроен в другой объект, время жизни которого заканчивается, или когда он был выделен динамически и явно освобожден. Его основная цель - освободить ресурсы (выделение памяти, открытые файлы или сокеты, соединения с базой данных., блокировки ресурсов и т. д.), которые были получены объектом в течение его жизни и / или отменены регистрации у других сущностей, которые могут сохранять ссылки на него. Использование деструкторов необходимо для процесса инициализации получения ресурсов (RAII).
В большинстве типов алгоритмов автоматической сборки мусора освобождение памяти может происходить через долгое время после того, как объект становится недоступным, что делает деструкторы ( в данном случае называемые финализаторами ) непригодными для большинства целей. В таких языках освобождение ресурсов осуществляется либо с помощью лексической конструкции (например, try..finally, Python "with" или Java "try-with-resources"), что эквивалентно RAII, или явно путем вызова a функция (эквивалент явного удаления); в частности, многие объектно-ориентированные языки используют шаблон Dispose .
Синтаксис деструктора [ править ]
- C ++ : деструкторы имеют то же имя, что и класс, с которым они связаны, но с префиксом тильды (~). [2]
- D : деструкторы объявляются с именем
~this()
(тогда как конструкторы объявляются сthis()
). - Object Pascal : деструкторы имеют ключевое слово
destructor
и могут иметь пользовательские имена, но в большинстве случаев именуютсяDestroy
. - Objective-C : у метода деструктора есть имя
dealloc
. - Perl : у метода деструктора есть имя
DESTROY
; в расширении объектной системы Moose он названDEMOLISH
. - PHP : в PHP 5+ у метода деструктора есть имя
__destruct
. В предыдущих версиях PHP не было деструкторов. [3] - Python : в
__del__
руководстве по языку Python 2 [4] есть методы, называемые деструкторами [4], но на самом деле они являются финализаторами, как признано в Python 3. [5] - Rust : метод деструктора для rust имеет название
drop
[6] - Swift : у метода деструктора есть имя
deinit
.
В C ++ [ править ]
Деструктор имеет то же имя, что и класс, но с тильдой (~) перед ним. [2] Например, класс с именем foo будет иметь деструктор . Кроме того, деструкторы не имеют ни параметров, ни возвращаемых типов. [2] Как указано выше, деструктор для объекта вызывается всякий раз, когда заканчивается время жизни объекта. [2] Если объект был создан как автоматическая переменная , его время жизни заканчивается, и деструктор вызывается автоматически, когда объект выходит за пределы области видимости. Поскольку C ++ не имеет сборки мусора, если объект был создан с помощью оператора (динамически в куче ), его деструктор вызывается, когда~foo()
new
delete
Оператор применяется к указателю на объект. Обычно эта операция выполняется в другом деструкторе, обычно в деструкторе объекта интеллектуального указателя .
В иерархиях наследования объявление виртуального деструктора в базовом классе гарантирует, что деструкторы производных классов вызываются правильно, когда объект удаляется с помощью указателя на базовый класс. Объекты, которые могут быть удалены таким образом, должны наследовать виртуальный деструктор.
Деструктор никогда не должен вызывать исключения. [7]
Пример [ править ]
#include <cstring>#include <iostream>class Foo { public : Foo () : data_ ( новый char [ sizeof ( "Hello, World!" )]) { std :: strcpy ( data_ , "Hello, World!" ); } Foo ( const Foo и другие ) = удалить ; // отключаем создание копирования Foo & operator = ( const Foo & other ) = delete ; // отключаем присвоение ~ Foo ( недействительно ) { удалить [] данные_ ; }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 ; }
Объекты, которые не могут быть безопасно скопированы и / или назначены, должны быть отключены от такой семантики, объявив их соответствующие функции удаленными на общедоступном уровне инкапсуляции. Подробное описание этого метода можно найти в популярной книге Скотта Мейерса « Эффективный современный C ++» (правило 11: «Предпочитайте удаленные функции частным неопределенным» [8] ).
В C с расширениями GCC [ править ]
В GNU Compiler Collection «сек C компилятор поставляется с 2 - расширений , которые позволяют реализовать деструкторов:
destructor
Атрибут функции [9] позволяет определить глобальные приоритизированные функции деструктора: когдаmain()
возвращается, то эти функции вызываются в порядке приоритета перед процессом завершается. См. Также: Взлом искусства эксплуатации . [10]- Очистки атрибут переменной позволяет подключать функцию деструктора к переменной: функция вызывается , когда переменная выходит из области видимости.
Xojo [ править ]
Деструкторы в Xojo (REALbasic) могут быть в одной из двух форм. Каждая форма использует обычное объявление метода со специальным именем (без параметров и без возвращаемого значения). В более старой форме используется то же имя, что и в классе с префиксом ~ (тильда). В новой форме используется это имя Destructor
. Более новая форма предпочтительна, потому что она упрощает рефакторинг класса.
Класс Foobar // Старая форма Sub ~ Foobar () Конец подписки // Новая форма Суб-деструктор () Конец подпискиКонец класса
См. Также [ править ]
- Финализатор
- Конструктор (информатика)
- Время жизни объекта
- Приобретение ресурсов - это инициализация
Ссылки [ править ]
- ^ "дтор" . TheFreeDictionary.com . Проверено 14 октября 2018 .
- ^ a b c d e Себеста, Роберт В. (2012). « « 11.4.2.3 Конструкторы и деструкторы » ». Концепции языков программирования (печать) (10-е изд.). Бостон, Массачусетс, США: Аддисон-Уэсли. п. 487. ISBN. 978-0-13-139531-2.
- ^ Конструкторы и деструкторы , из онлайн-документации PHP
- ^ https://docs.python.org/2/reference/datamodel.html#object.__del__
- ^ https://docs.python.org/3/reference/datamodel.html#object.__del__
- ^ https://doc.rust-lang.org/stable/reference/destructors.html
- ^ GotW # 47: Неперехваченные исключения, по состоянию на 31 июля 2011 г.
- ^ Скотт Мейерс: Эффективный современный C ++ , О'РЕЙЛИ, ISBN 9781491903995
- ^ C Атрибут функции "деструктор"
- ^ Эриксон, Джон (2008). Взломать искусство эксплуатации . Пресс без крахмала . ISBN 1-59327-144-1.