# V689. Destructor of 'Foo' class is not declared as virtual. A smart pointer may not destroy an object correctly.

Анализатор обнаружил, что умный указатель может неправильно разрушить объект. Причина ошибки в том, что в базовом классе отсутствует виртуальный деструктор.

Рассмотрим пример:

    class Base
    {
      public:
      ~Base() { }
    };
    class Derived : public Base
    {
      public:
      Derived()
      {
        data = new int[5];
      }
      ~Derived()
      {
        delete [] data;
      }
      int* data;
    };

    void GO()
    {
      std::auto_ptr<Base> smartPtr(new Derived);
    }

Обратите внимание, что создаётся объект класса 'Derived'. Однако, умный указатель хранит ссылку на класс Base. В классе Base деструктор не является виртуальным. В результате возникнет ошибка, когда умный указатель попробует разрушить объект, отданный ему на хранение.

Исправленный вариант класса Base:

    class Base
    {
      public:
      virtual ~Base() { }
    };

P.S.

Родственным диагностическим сообщением является V599.

Дополнительная информация:

- Wikipedia. Таблица виртуальных методов.
- Wikipedia. Виртуальный метод (виртуальная функция).
- Wikipedia. Деструктор.
- Сергей Олендаренко. Виртуальные функции и деструктор.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки управления динамической памятью (выделения, освобождения, использования освобожденной памяти) [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-404 CERT-OOP52-CPP