Деструкторы

Деструктор есть специальный метод, вызывающийся при разрушении экземпляра класса или структуры. Деструктор необходим для того, чтобы можно было освободить какие-либо ресурсы, принадлежащие объекту - отдать аллокатору память, закрыть файлы, завершить сетевые соединения и т. д.

Деструктором является метод со специальным именем destructor. У данного метода можно не объявлять явно параметр this, он будет неявно создан. Деструктор должен иметь только один параметр - this, другие параметры не допускаются. this в деструкторе не может быть объявлен как byval. Перегружать деструктор нельзя.

Деструктор вызывается всегда, когда экземпляр структуры или класса надо разрушить:

  • при выходе из области видимости (для локальных переменных)
  • при выходе из функции (для аргументов)
  • в деструкторе другого класса (для полей)
  • при разрушении временной переменной
  • при операциях с контейнерами

Деструкторы для локальных переменных в одной области видимости и для аргументов вызываются в порядке, обратном созданию. Деструктор структуры или класса неявно зовёт деструкторы полей.

struct T {}

struct S
{
    fn destructor()
    {
    } // Вызовется деструктор для "t"

    T t;
}

fn Foo( S s0 )
{
    var S s1;
    var S s2;
    {
         var S s3;
    } // вызовется деструктор для "s3"
    // вызовутся деструкторы для "s2" и "s1"
} // вызовется деструктор для "s0"

Генерация деструкторов

Если у структуры или класса деструктор не указан явно, он будет сгенерирован компилятором. Сгенерированный деструктор не будет делать ничего, кроме вызова деструкторов полей структуры или класса.

Если нет необходимости, явно деструктор объявлять не нужно, т. к. явный деструктор может помешать типу структуры стать constexpr.