Что такое нетривиальный деструктор в C ++? - PullRequest
12 голосов
/ 19 ноября 2011

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 19 ноября 2011

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

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

4 голосов
/ 19 ноября 2011

То есть вы имеете в виду, что полное объявление C таково:

class C { };

?

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

0 голосов
/ 19 ноября 2011

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

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

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

...