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

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

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

```cpp
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:

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

P\.S\.

Родственным диагностическим сообщением является [V599](https://pvs-studio.ru/ru/docs/warnings/v599/)\.

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

1. Wikipedia\. [Таблица виртуальных методов\.](https://ru.wikipedia.org/wiki/%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2) 
1. Wikipedia\. [Виртуальный метод \(виртуальная функция\)\.](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4)
1. Wikipedia\. [Деструктор\.](https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80) 
1. Сергей Олендаренко\. [Виртуальные функции и деструктор\.](https://habr.com/ru/post/64280/)