Что такое нетривиальный деструктор в C++?

Я читал это, в котором упоминается, что деструкторы тривиальны и нетривиальны.

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

Например, у меня есть класс,

class C {
    public:
     ~C(); // not explicitly declared.
};

Если C::~C() определен неявно, это делает trival dtor?

3 ответа

Решение

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

Правило очень простое: есть ли у вашего класса явный деструктор? Если да, то вы нетривиальны. Если нет, проверьте каждый нестатический член-объект; если какой-либо из них нетривиален, то вы нетривиальны.

Таким образом, вы имеете в виду, вся декларация C это:

class C { };

?

Тогда да: с C не имеет объектов-членов и базовых классов, поэтому у него нет объектов-членов с нетривиальными деструкторами и нет базовых классов с нетривиальными деструкторами, поэтому его неявно определенный деструктор является тривиальным.

Я думаю, что в целом это относится к деструктору, который на самом деле делает что-то вроде:

  • Освободить память
  • Закрыть соединение с базой данных
  • Или позаботьтесь о любом ресурсе, который должен быть освобожден

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

Другие вопросы по тегам