Освобождение указателя с помощью 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++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки: BAD_DELETE |
Удар: высоко |
ID CWE: 404 |
Find defects (-checkers)
| Invalid free of pointer
| Memory leak