В объектно-ориентированном программировании, деструктор (иногда сокращенно доктор ) - это метод, который вызывается механически непосредственно перед освобождением объекта . Это может произойти, когда его время жизни привязано к scope и выполнение покидает область, когда оно встроено в другой объект, время жизни которого заканчивается, или когда он был выделен динамически и выпущен явно. Его основная цель - освободить ресурсы (выделение памяти, открытые файлы или файлы, соединения с базой данных, блокировки ресурсов и т. Д.), Которые были получены объекты во время его жизни и / или отменить регистрацию других объектов, которые включают ссылки на него. Использование деструкторов необходимо для процесса Инициализация получения ресурсов (RAII).
В типах типов автоматической сборки мусора освобождение памяти может происходить через долгое время после того, как объект становится недоступным, создаваемые деструкторы (в данном случае называемые финализаторами ) непригоден для всех целей. Такое освобождение ресурсов осуществляется либо с помощью лексической конструкции (например, попробуйте... наконец, Python "с" или Java "попробуйте с ресурсами"), что эквивалентно RAII, или явно вызов функции (эквивалент явного удаления); в частности, многие объектно-ориентированные используют шаблон Dispose.
~ this ()
(тогда как конструкторы объявляются с this ()
).деструктор
и может иметь, но чаще всего называется Destroy
.dealloc
.DESTROY
; в расширении объектной системы Moose он назван DEMOLISH
.__ destruct
.__del__
, называемые деструкторами по языку Python 2, но на самом деле они являются финализаторами, как признано в Python 3.deinit
.Имя деструктора совпадает с именем класса, но перед ним стоит тильда (Например, класс с именем foo будет иметь деструктор ~ foo. ()
. указан выше, деструктор для объекта вызывается всякий раз, когда заканчивается время жизни объекта. Если объект был создан как автоматическая переменная , его время жизни заканчивается, и деструктор вызывается автоматически, когда объект выходит за пределы области видимости. C ++ не имеет сборки мусора, если объект был создан с помощью оператора
(динамически в куче ), его деструктор вызывается при новый
Оператор примененному к указателю на объект. Обычно эта операция выполняется в другом деструкторе, обычно в деструкторе объекта интеллектуального указателя.delete
В иерархиях наследования объявление виртуального деструктора в базовом классе гарантирует, что деструкторы производных классов вызываются должным образом, когда объект удаляется с помощью указателя на базовый класс. Объекты, которые могут быть удалены таким образом, должны наследовать виртуальный деструктор.
Деструктор никогда не должен генерировать исключение.
#include#include class Foo {public: Foo (): data_ (new char [sizeof («Привет, мир!»)]) {Std :: strcpy (data_, «Привет, мир!»); } Foo (const Foo другие) = удалить; // отключаем создание копирования Foo operator = (const Foo other) = delete; // отключаем присвоение ~ Foo (void) {delete data_; } private: friend std :: ostream operator <<(std::ostreamos, const Foofoo) { os << foo.data_; return os; } char* data_; }; int main() { Foo foo; std::cout << foo << std::endl; }
Объекты, которые нельзя скопировать и / или присвоить, должны быть отключены от таких семантики, объявив их соответствующие функции удаленными на общедоступном уровне инкапсуляции. Подробное описание метода можно найти в популярной книге Скотта Мейерса «Эффективный современный C ++» (правило 11: «Предпочитайте удаленные функции частным неопределенным.»).
Компилятор GNU Compiler Collection C поставляется двумя расширениями, которые позволяют реализовать деструкторы:
деструктор
позволяет определять глобальные функции деструктора с приоритетом: когда main ()
возвращается, эти функции вызываются в порядке приоритета до завершения процесса. См. Также: Взлом искусства эксплуатации.Деструкторы в Xojo (REALbasic) могут быть в одной из двух форм. Каждая форма использует обычное объявление со специальным именем (без параметров и возвращаемых значений). В более старой форме используется то же имя, что и у класса с префиксом ~ (тильда). В новой форме используется имя Деструктор
. Более новая форма предпочтительна, потому что она упрощает рефакторинг класса.
Class Foobar // Старая форма Sub ~ Foobar () End Sub // Новая форма Sub Destructor () End Sub End Class