Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Destructor (информатика) )
Перейти к навигации Перейти к поиску

В объектно-ориентированном программировании , 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()newdeleteОператор применяется к указателю на объект. Обычно эта операция выполняется в другом деструкторе, обычно в деструкторе объекта интеллектуального указателя .

В иерархиях наследования объявление виртуального деструктора в базовом классе гарантирует, что деструкторы производных классов вызываются правильно, когда объект удаляется с помощью указателя на базовый класс. Объекты, которые могут быть удалены таким образом, должны наследовать виртуальный деструктор.

Деструктор никогда не должен вызывать исключения. [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 () Конец подписки // Новая форма Суб-деструктор () Конец подпискиКонец класса

См. Также [ править ]

  • Финализатор
  • Конструктор (информатика)
  • Время жизни объекта
  • Приобретение ресурсов - это инициализация

Ссылки [ править ]

  1. ^ "дтор" . TheFreeDictionary.com . Проверено 14 октября 2018 .
  2. ^ a b c d e Себеста, Роберт В. (2012). « « 11.4.2.3 Конструкторы и деструкторы » ». Концепции языков программирования (печать) (10-е изд.). Бостон, Массачусетс, США: Аддисон-Уэсли. п. 487. ISBN.  978-0-13-139531-2.
  3. ^ Конструкторы и деструкторы , из онлайн-документации PHP
  4. ^ https://docs.python.org/2/reference/datamodel.html#object.__del__
  5. ^ https://docs.python.org/3/reference/datamodel.html#object.__del__
  6. ^ https://doc.rust-lang.org/stable/reference/destructors.html
  7. ^ GotW # 47: Неперехваченные исключения, по состоянию на 31 июля 2011 г.
  8. ^ Скотт Мейерс: Эффективный современный C ++ , О'РЕЙЛИ, ISBN 9781491903995 
  9. ^ C Атрибут функции "деструктор"
  10. ^ Эриксон, Джон (2008). Взломать искусство эксплуатации . Пресс без крахмала . ISBN 1-59327-144-1.