Удаление указателя с помощью delete
без соответствующего выделения с помощью new
Этот дефект возникает, когда:
Вы выпускаете блок памяти с delete
оператор, но память ранее не была выделена с new
оператор.
Вы выпускаете блок памяти с delete
оператор, использующий однообъектное обозначение, но память ранее выделялась как массив со new
оператор.
Этот дефект применяется только к исходным файлам C++.
Риск зависит от причины проблемы:
The 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++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: BAD_DELETE |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 404 |
Find defects (-checkers)
| Invalid free of pointer
| Memory leak