Отмена выделения указателя с помощью 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 |
| Воздействие: Высокое |
| CWE ID: 404 |
Find defects (-checkers) | Invalid free of pointer | Memory leak