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

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

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

Дестру́ктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).

Содержание

Деструктор в Delphi

Для объявления деструктора в Delphi используется ключевое слово destructor. Имя деструктора может быть любым, но рекомендуется всегда называть деструктор Destroy.

  TClassWithDestructor = class
    destructor Destroy; override;
  end;

В Delphi все классы являются потомками, по крайней мере, класса TObject, поэтому, для корректного освобождения памяти, необходимо перекрывать деструктор, используя директиву override.

В Delphi прямой вызов деструктора используется редко. Вместо него используют метод Free.

 MyObject.Free;

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

Деструктор в С++

    class NameOfClass
    {
        public:
             NameOfClass(int m);
             ~NameOfClass();
             int a;
    };
 
    NameOfClass::~NameOfClass()
    {
        cout << NameOfClass.a << "\n";
    }
 
    NameOfClass::NameOfClass(int m)
    {
        a = m;
    }

~NameOfClass() - деструктор, имеет имя ~NameOfClass, не имеет входных параметров.
В данном случае при уничтожении объекта выводит в консоль параметр a.

Виртуальный деструктор

Практически всегда деструктор делается виртуальным. Делается это для того, чтобы корректно (без утечек памяти) уничтожались объекты не только заданного класса, а и любого производного от него. Например: в игре уровни, звуки и спрайты могут создаваться загрузчиком, а уничтожаться — менеджером памяти, для которого нет разницы между уровнем и спрайтом.

Пусть (на C++) есть тип Father и порождённый от него тип Son:

class Father
{
public:
  Father() {}
  ~Father() {} 
};
 
class Son : public Father
{
public:
  int* buffer;
  Son() : Father() { buffer = new int[1024]; }
  ~Son() { delete[] buffer; }
};

Нижеприведённый код является некорректным и приводит к утечке памяти.

Father* object = new Son();   // вызывается Son()
delete object;                // вызывается ~Father()!!

Однако, если сделать деструктор Son виртуальным:

class Father
{
public:
  Father() {}
  virtual ~Father() {} 
};
 
class Son : public Father
{
private:
  int* buffer;
public:
  Son() : Father() { buffer = new int[1024]; }
  virtual ~Son() { delete[] buffer; }
};

вызов delete object; вызовет правильный деструктор класса Son.

В Delphi все классы порождаются от TObject, деструктор которого является виртуальным, поэтому нет необходимости самому объявлять деструкторы любых объектов виртуальными.

Деструктор в UML

См. также


Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "Деструктор (программирование)" в других словарях:

  • Деструктор класса — Деструктор специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Содержание 1 Деструктор в Delphi 2 Деструктор в С++ 3 Виртуальный деструктор …   Википедия

  • Деструктор — У этого термина существуют и другие значения, см. Деструкторы (экология). Деструктор  специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Содержание 1 Деструктор в Delphi 2 Деструктор в С++ …   Википедия

  • Конструктор (программирование) — У этого термина существуют и другие значения, см. Конструктор. В объектно ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor)  специальный блок инструкций, вызываемый при создании объекта.… …   Википедия

  • Объектно-ориентированное программирование на Python — Объектно ориентированное программирование на Python  программирование на Python с использованием парадигмы ООП: с самого начала Python проектировался как объектно ориентированный язык программирования[1]. Содержание 1 Введение 1.1 …   Википедия

  • Объектно-ориентированное программирование на Питоне — С самого начала Питон проектировался как объектно ориентированный язык программирования [1]. Содержание 1 Введение 1.1 Принципы ООП …   Википедия

  • Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных  метаклассы, интерфейсы, структуры, перечисления  характеризуются какими то своими, другими… …   Википедия

  • Класс (объектно-ориентированное программирование) — Класс, наряду с понятием «объект», является важным понятием объектно ориентированного подхода в программировании (хотя существуют и бесклассовые объектно ориентированные языки, например, Прототипное программирование). Под классом подразумевается… …   Википедия

  • Правило трёх (C++ программирование) — Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка»)  правило в C++, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода[1]: Деструктор… …   Википедия

  • Правило трех (C++ программирование) — Правило трёх (также известное как «Закон Большой Тройки» или «Большая Тройка»)  правило в C++, гласящее, что если класс или структура определяет один из следующих методов, то они должны явным образом определить все три метода[1]: Деструктор… …   Википедия

  • Блок (программирование) — У этого термина существуют и другие значения, см. Блок. Блок кода, блок команд, блок инструкций  часть кода, которая сгруппирована и воспринимается как единое целое (похоже на параграф). Блоки могут состоять из одного или нескольких… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»