Анализатор обнаружил, что умный указатель может неправильно разрушить объект. Причина ошибки в том, что в базовом классе отсутствует виртуальный деструктор.
Рассмотрим пример:
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.
Дополнительная информация:
Данная диагностика классифицируется как:
|