2016-08-17 5 views
-2

Моя компания использует Parasoft для проверки правильности нашей программы c/C++.Нарушение Parasoft: Destructor ~ dest должен быть виртуальным

В исходном коде многие классы не используются в качестве базового класса и не имеют виртуальных функций-членов. Но они наследуются от другого класса. Вот пример кода:

class class_a : public base{ 
    protected: 
     int* pa; 

    public: 
     class_a(); 
     ~class_a(){free(pa);}; 
     int* get_a(){return pa}; 
     ... 
} 

Однако parosoft говорит:

деструктор ~ class_a должен быть виртуальным

Если изменить деструктор виртуальным, нарушение disappears.But Я не думаю, что это правильный способ исправить это.

Итак, это просто сообщение об ошибке или есть некоторые недостатки в нашем коде?

Что может вызвать такую ​​ошибку в парашюте?

При каких условиях парасофт покажет такое же сообщение об ошибке?

Последующие действия: Многие из этих классов определяют функции, которые полностью совпадают с их базовым классом. Эти функции не являются виртуальными.

+0

Если он не будет использоваться в качестве базового класса, вы можете изменить 'pa' с' protected' на 'private'. – songyuanyao

+0

О, я вижу. Но для классов, которые имеют только частные переменные-члены, parasoft показывает те же сообщения о нарушениях. @ Songyuanyao –

+0

Двигатели SCA склонны сообщать о ложных срабатываниях, искать лучшего может быть. –

ответ

0

Просто дайте инструмент знать класс не предназначен в качестве базового класса:

class class_a final { 

Инструмент должен знать, что это бессмысленно иметь виртуальный деструктор в final классе.

0

Причина довольно проста. Поскольку базовый класс имеет функцию виртуального члена, но его деструктор не является виртуальным.

Смежные вопросы