Деструктор (компьютерное программирование)

редактировать

В объектно-ориентированном программировании, деструктор (иногда сокращенно доктор ) - это метод, который вызывается механически непосредственно перед освобождением объекта . Это может произойти, когда его время жизни привязано к scope и выполнение покидает область, когда оно встроено в другой объект, время жизни которого заканчивается, или когда он был выделен динамически и выпущен явно. Его основная цель - освободить ресурсы (выделение памяти, открытые файлы или файлы, соединения с базой данных, блокировки ресурсов и т. Д.), Которые были получены объекты во время его жизни и / или отменить регистрацию других объектов, которые включают ссылки на него. Использование деструкторов необходимо для процесса Инициализация получения ресурсов (RAII).

В типах типов автоматической сборки мусора освобождение памяти может происходить через долгое время после того, как объект становится недоступным, создаваемые деструкторы (в данном случае называемые финализаторами ) непригоден для всех целей. Такое освобождение ресурсов осуществляется либо с помощью лексической конструкции (например, попробуйте... наконец, Python "с" или Java "попробуйте с ресурсами"), что эквивалентно RAII, или явно вызов функции (эквивалент явного удаления); в частности, многие объектно-ориентированные используют шаблон Dispose.

Содержание

  • 1 Синтаксис деструктора
  • 2 В C ++
    • 2.1 Пример
  • 3 В C с расширениями GCC
  • 4 Xojo
  • 5 См. Также
  • 6 Ссылки

Синтаксис деструктора

  • C ++ : деструкторы имеют то же имя, что и класс, с которыми они связаны, но с тильдой (~) префикс.
  • D : деструкторы объявляются с именем ~ this ()(тогда как конструкторы объявляются с this ()).
  • Object Pascal : деструкторы имеют используемое слово деструктори может иметь, но чаще всего называется Destroy.
  • Objective-C : метод деструктора свойства имеет имя dealloc.
  • Perl : метод деструктора иметь имя DESTROY; в расширении объектной системы Moose он назван DEMOLISH.
  • PHP : В PHP 5+ метод деструктора имеет имя __ destruct.
  • Python : существуют методы __del__, называемые деструкторами по языку Python 2, но на самом деле они являются финализаторами, как признано в Python 3.
  • Swift : метод деструктора имеет имя deinit.

В C ++

Имя деструктора совпадает с именем класса, но перед ним стоит тильда (Например, класс с именем 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: «Предпочитайте удаленные функции частным неопределенным.»).

В C с расширениями GCC

Компилятор GNU Compiler Collection C поставляется двумя расширениями, которые позволяют реализовать деструкторы:

  • Атрибут функции деструкторпозволяет определять глобальные функции деструктора с приоритетом: когда main ()возвращается, эти функции вызываются в порядке приоритета до завершения процесса. См. Также: Взлом искусства эксплуатации.
  • Атрибут включенной очистки позволяет присоединить функцию деструктора к включенной функции: вызывается, когда переменная выходит за пределы области видимости.

Xojo

Деструкторы в Xojo (REALbasic) могут быть в одной из двух форм. Каждая форма использует обычное объявление со специальным именем (без параметров и возвращаемых значений). В более старой форме используется то же имя, что и у класса с префиксом ~ (тильда). В новой форме используется имя Деструктор. Более новая форма предпочтительна, потому что она упрощает рефакторинг класса.

Class Foobar // Старая форма Sub ~ Foobar () End Sub // Новая форма Sub Destructor () End Sub End Class

См. Также

Ссылки

Последняя правка сделана 2021-05-17 03:08:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте