Если публичный деструктор класса не является виртуальным, то класс должен быть объявлен окончательным
Если публичный деструктор класса не является виртуальным, то класс должен быть объявлен окончательным.
В C++ при уничтожении любого объекта производного класса сначала вызывается деструктор его класса, а затем вызываются деструкторы базовых классов. Иерархии классов также могут быть полиморфными. Можно объявить указатель базового класса и назначить ему производный объект класса. Для безопасного уничтожения объектов, принадлежащих иерархии классов, объявите public деструкторы классов как virtual. Рассмотрим этот код, в котором уничтожаются два указателя базового класса, указывающие на производные объекты.
class Base{
public:
virtual ~Base();
//..
};
class Derived : public Base{
public:
~Derived();
//..
};
class Base2{
public:
~Base2();
//..
};
class Derived2 : public Base2{
public:
~Derived2();
//...
};
int main(){
Base* ptr = new Derived;
Base2* ptr2 = new Derived2;
delete ptr;
delete ptr2;
}Объект ptr является указателем класса Base указывает на объект класса Derived. Когда ptr удаляется, сначала вызывается деструктор производного класса, а затем вызывается деструктор базового класса. Несмотря на то, что ptr является объектом базового класса, правильные деструкторы вызываются для освобождения всех полученных ресурсов, поскольку public деструкторы в этой иерархии классов объявляются как virtual.
Когда указатель ptr2 удален, деструктор только базового класса вызывается, так как public деструкторы в этой иерархии классов не являются виртуальными. Этот вид неполного разрушения является неопределённым поведением, которое может привести к утечкам памяти и неожиданному завершению выполнения кода.
Для предотвращения неопределенного поведения не используйте классы с public невиртуальные деструкторы как базовые классы. Объявить такие классы как final чтобы указать, что эти классы не являются базовыми классами, и новые классы не могут быть получены из них.
Polyspace ® помечает объявление класса, если оба этих оператора имеют значение true:
public деструктор класса не объявлен как virtual.
Класс не объявлен final.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Специальные функции-члены |
| Категория: Консультации, Автоматизированные |