Нарушение 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 учебный класс.

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