Освобождение указателя с помощью 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