Base class destructor not virtual

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

Описание

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

Риск

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

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

Фиксация

Одна возможная фиксация должна всегда использовать 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 деструктор. Поэтому, если 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++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: DTOR_NOT_VIRTUAL
Удар: Средняя
Введенный в R2015b