Invalid deletion of pointer

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

Примеры

расширить все

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[]. The new- delete пара не совпадает. Не используйте 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: BAD_DELETE
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 404
Введенный в R2013b