Вы удаляете или приводите к указателю на неполный класс
Этот дефект возникает при удалении или приведении к указателю на неполный класс. Неполный класс является классом, определение которого не отображается в точке, где используется класс.
Например, определение Body классов
не отображается, когда delete
вызывается оператор для указателя на Body
:
class Handle { class Body *impl; public: ~Handle() { delete impl; } // ... };
При удалении указателя на неполный класс невозможно вызвать нетривиальный деструктор, который мог бы иметь класс. Если деструктор выполняет операции очистки, такие как удаление памяти, эти действия не выполняются.
Аналогичная проблема возникает, например, когда вы понижаете значение до указателя на неполный класс (понижение значения - это приведение значения от указателя на базовый класс к указателю на производный класс). На точку даункастинга связь между основой и производным классом не известна. В частности, если производный класс наследует от нескольких классов, в точке нисходящего преобразования эта информация не доступна. Понижающее значение не может вносить необходимые корректировки для нескольких наследований, и полученный указатель не может быть удален.
Аналогичный оператор может быть сделан для апкастинга (приведение из указателя в производный класс в указатель на базовый класс).
Когда вы удаляете или понижаете значение на указатель на класс, убедитесь, что определение класса отображается.
Также можно выполнить одно из следующих действий:
Вместо обычного указателя используйте std::shared_ptr
type, чтобы указать на неполный класс.
При понижении, убедитесь, что результат действителен. Запись кода обработки ошибок для недопустимых результатов.
Группа: Объектно-ориентированная |
Язык: C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: INCOMPLETE_CLASS_PTR |
Влияние: Средний |
Delete of void pointer
| Find defects (-checkers)
| MISRA C++:2008 Rule 5-2-4
| MISRA C++:2008 Rule 5-2-7
| MISRA C++:2008 Rule 5-2-8