Invalid deletion of pointer

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

Примеры

развернуть все

void assign_ones(void)
{
    int ptr[10];

    for(int i=0;i<10;i++)
        *(ptr+i)=1;  

    delete[] ptr;   
}

Указатель ptr выпущен с помощью delete оператор. Однако ptr точки к ячейке памяти, которая не была динамически выделена.

Коррекция: удалите освобождение указателя

Если число элементов массива ptr известен во время компиляции, одна возможная коррекция должна удалить освобождение указателя ptr.

void assign_ones(void) 
{
    int ptr[10];

    for(int i=0;i<10;i++)
        *(ptr+i)=1;  
}
Коррекция — добавляет выделение указателя

Если количество элементов массива не известно во время компиляции, одна возможная коррекция должна динамически выделить память массиву ptr использование new оператор.

void assign_ones(int num) 
{
    int *ptr = new int[num]; 

    for(int i=0; i < num; i++)
        *(ptr+i) = 1;

    delete[] ptr;
   }
int main (void)
{
    int *p_scale = new int[5];

    //more code using scal

    delete p_scale;
}

В этом примере, p_scale инициализируется к массиву размера 5 использований new int[5]. Однако p_scale удален с delete вместо delete[]. newудаление пара не соответствует. Не используйте delete без скобок при удалении массивов.

Коррекция — совпадает с delete к new

Одна возможная коррекция должна добавить скобки так delete совпадает с new [] объявление.

int main (void)
{
    int *p_scale = new int[5];

    //more code using p_scale

    delete[] p_scale;
}
Коррекция — совпадает с new к delete

Другая возможная коррекция должна изменить объявление p_scale. Если вы означали инициализировать p_scale как 5 самостоятельно вместо массива размера 5, необходимо использовать различный синтаксис. Для этой коррекции измените квадратные скобки в инициализации к круглым скобкам. Оставьте delete оператор как есть

int main (void)
{
    int *p_scale = new int(5);

    //more code using p_scale

    delete p_scale;
}

Проверяйте информацию

Группа: Динамическая память
Язык: C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: BAD_DELETE
Удар: высоко
ID CWE: 404
Введенный в R2013b