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