COM-подобные интерфейсы предупреждают о не виртуальном деструкторе
Есть ли способ сказать gcc, что компилируемому абстрактному классу не нужен виртуальный деструктор (как никогда не бывает у COM-объектов)? Например, nsISupports всегда жалуется на отсутствующий виртуальный деструктор. Отключение предупреждения не поможет, так как у меня могут быть классы, не похожие на COM, где я хочу это предупреждение.
Так что __attribute__((com_interface)) устарел и изменил только макет vtable. Есть ли другой __attribute__, где я могу сказать компилятору, что не хочу, чтобы меня предупреждали об отсутствующем деструкторе в этом классе?
3 ответа
Недостающее предупреждение о виртуальном dtor есть по причине - главным образом потому, что это отладочный кошмар для отслеживания, особенно в большой и сложной базе кода
У вас может быть очень конкретная причина для этого, но спросите себя, что произойдет, если класс подвергнется рефакторингу, так что его использование изменится позже?
Я думаю, что вы должны пересмотреть возможность отключения этого предупреждения. Это там по причине. Сегодня нельзя помещать виртуальный деструктор в ваш класс, но вы не можете точно предсказать, как ваш класс будет использоваться в будущем.
Незначительные изменения в использовании класса могут привести к тому, что следующий разработчик потратит свои силы на несколько часов, пытаясь отследить утечку ресурсов. Сделайте этому человеку одолжение и сделайте деструктор виртуальным сейчас.
Также вы можете спросить себя
Что я получу, сделав его не виртуальным
Вы упомянули наличие абстрактного класса, поэтому я предполагаю, что он имеет хотя бы одну виртуальную функцию. Таким образом, создание виртуального деструктора не добавляет к объекту v-таблицу, а просто расширяет его, добавляя в него другого члена.
Я не вижу никакой реальной выгоды в том, чтобы сделать это не виртуальным. Только проблемы.
Вы, вероятно, хотите использовать пару диагностических прагм. В противном случае, #pragma GCC system_header
отключает все предупреждения в данном файле.