Удаление или приведение к указателю на неполный класс
Этот дефект возникает при удалении или приведении к указателю на неполный класс. Неполный класс - это класс, определение которого не отображается в точке использования класса.
Например, определение класса Body не виден, когда delete вызывается оператор по указателю на Body:
class Handle {
class Body *impl;
public:
~Handle() { delete impl; }
// ...
};При удалении указателя на неполный класс невозможно вызвать какой-либо нетривиальный деструктор, который может быть у класса. Если деструктор выполняет операции очистки, такие как освобождение памяти, эти операции не выполняются.
Подобная проблема возникает, например, при понижении канала до указателя на неполный класс (понижающий канал - это переход от указателя на базовый класс к указателю на производный класс). В точке нисходящего вещания связь между базовым и производным классом неизвестна. В частности, если производный класс наследует от нескольких классов, в момент понижения, эта информация недоступна. Нисходящая трансляция не может произвести необходимые корректировки для множественного наследования, и результирующий указатель не может быть удален.
Подобная инструкция может быть сделана для передачи (приведение от указателя к производному классу к указателю к базовому классу).
При удалении или переходе к указателю на класс убедитесь, что определение класса видно.
Кроме того, можно выполнить одно из следующих действий:
Вместо обычного указателя используйте std::shared_ptr введите для указания на неполный класс.
При спуске убедитесь, что результат действителен. Запись кода обработки ошибок для недопустимых результатов.
| Группа: Объектно-ориентированная |
| Язык: C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки:
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