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