Нарушение Parasoft:Destructor ~dest должен быть виртуальным
Моя компания использует Parasoft для проверки правильности нашей программы c/ C++.
В исходном коде многие классы не используются в качестве базового класса и не имеют виртуальных функций-членов. Но они наследуют от другого класса. Вот пример кода:
class class_a : public base{
protected:
int* pa;
public:
class_a();
~class_a(){free(pa);};
int* get_a(){return pa};
...
}
Тем не менее, parosoft говорит:
Деструктор ~ class_a должен быть виртуальным
Если я изменю деструктор на виртуальный, нарушение исчезнет. Но я не думаю, что это правильный способ его исправить.
Итак, это просто ложное сообщение о нарушении или в нашем коде есть некоторые недостатки?
Что может стать причиной такого рода парасофт ошибки?
При каких условиях Parasoft покажет одно и то же сообщение об ошибке?
Продолжение: многие из этих классов определяют функции, которые полностью совпадают с их базовым классом. Эти функции не являются виртуальными.
2 ответа
Причина довольно проста. Поскольку базовый класс имеет виртуальную функцию-член, но его деструктор не виртуален.
Просто дайте инструменту знать, что класс не предназначен в качестве базового:
class class_a final {
Инструмент должен знать, что бессмысленно иметь виртуальный деструктор в final
учебный класс.