Освобождение указателя с помощью delete без соответствующего выделения с помощью new
Недопустимое удаление указателя происходит когда:
Вы выпускаете блок памяти с delete оператор, но память не был ранее выделен с new оператор.
Вы выпускаете блок памяти с delete оператор с помощью обозначения отдельного объекта, но памяти был ранее выделен как массив с new оператор.
Этот дефект применяется только к исходным файлам C++.
Риск зависит от причины проблемы:
delete оператор выпускает блок памяти, выделенной на куче. При попытке получить доступ к местоположению на куче, которую вы не выделили ранее, отказ сегментации может произойти.
Если вы используете обозначение отдельного объекта в delete на указателе, который ранее выделяется с обозначением массивов для new, поведение не определено.
Проблема может также подсветить другие ошибки кодирования. Например, вы, возможно, хотели использовать delete оператор или предыдущий new оператор на различном указателе.
Фиксация зависит от причины проблемы:
В большинстве случаев можно устранить проблему путем удаления delete оператор. Если указатель не является выделенной памятью от кучи с new оператор, вы не должны выпускать указатель с delete. Можно просто снова использовать указатель как требуется или позволить объекту быть уничтоженным в конце его осциллографа.
В случае несовпадающего обозначения для new и delete, откорректируйте несоответствие. Например, чтобы выделить и освободить отдельный объект, используйте это обозначение:
classType* ptr = new classType; delete ptr;
Чтобы выделить и освободить массив объекты, используйте это обозначение:
classType* p2 = new classType[10]; delete[] p2;
Если проблема подсвечивает ошибку кодирования, такую как использование delete или new на неправильном указателе откорректируйте ошибку.
| Группа: Динамическая память |
| Язык: C++ |
| Значение по умолчанию: 'off' |
Синтаксис командной строки: BAD_DELETE |
| Удар: высоко |
| ID CWE: 404 |
Find defects (-checkers) | Invalid free of pointer | Memory leak