Base class destructor not virtual

Класс не может вести себя полиморфно для удаления производных объектов классов

Описание

Этот дефект возникает, когда класс имеет virtual функции, но не virtual деструктор.

Риск

Наличие virtual functions указывает, что класс предназначен для использования в качестве базового класса. Однако, если класс не имеет virtual destructor, он не может вести себя полиморфно для удаления производных объектов классов.

Если указатель на этот класс ссылается на производный объект класса, и вы используете указатель для удаления объекта, вызывается только деструктор базового класса. Дополнительные ресурсы, выделенные в производном классе, не освобождаются и могут вызвать утечку ресурсов.

Зафиксировать

Одно из возможных исправлений - всегда использовать virtual деструктор в классе, который содержит virtual функций.

Примеры

расширить все

class Base {        
        public:
                Base(): _b(0) {};
                virtual void update() {_b += 1;};
        private:
                int _b;
};

class Derived: public Base {                     
        public:
                Derived(): _d(0) {};
                ~Derived() {_d = 0;};
                virtual void update() {_d += 1;};
        private:
                int _d;
};

В этом примере класс Base не имеет virtual деструктор. Поэтому, если a Base* указатель указывает на Derived объект, который выделяется памяти динамически, и delete операция выполняется на этом Base* указатель, Base вызывается деструктор. Память, выделенная для дополнительного представителя _d не освобождается.

Дефект появляется в определении базового класса. Ниже приведены некоторые советы по навигации в исходном коде:

  • Чтобы найти классы, выведенные из базового класса, щелкните правой кнопкой мыши имя базового класса и выберите Search For All References. Просмотрите каждый результат поиска, чтобы найти производные определения классов.

  • Чтобы найти, используете ли вы указатель или ссылку на базовый класс для указания на производный объект класса, щелкните правой кнопкой мыши имя базового класса и выберите Search For All References. Просмотрите результаты поиска, которые начинаются с Base* или Base& для поиска указателей или ссылок на базовый класс. Затем можно увидеть, используете ли вы указатель мыши или ссылку для указания на производный объект класса.

Коррекция - создайте виртуальный деструктор базового класса

Одной из возможных коррекций является объявление virtual деструктор для Base класса.

class Base {        
        public:
                Base(): _b(0) {};
                virtual ~Base() {_b = 0;};
                virtual void update() {_b += 1;};
        private:
                int _b;
};

class Derived: public Base {                     
        public:
                Derived(): _d(0) {};
                ~Derived() {_d = 0;};
                virtual void update() {_d += 1;};
        private:
                int _d;
};

Информация о результатах

Группа: Объектно-ориентированная
Язык: C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: DTOR_NOT_VIRTUAL
Влияние: Средний
Введенный в R2015b