AUTOSAR C++ 14 правил A18-5-3

Форма оператора delete должна соответствовать, форма нового оператора раньше выделяла память

Описание

Управляйте определением

Форма оператора delete должна соответствовать, форма нового оператора раньше выделяла память.

Объяснение

  • Оператор delete выпускает блок памяти, выделенной на куче. При попытке получить доступ к местоположению на куче, которую вы не выделили ранее, отказ сегментации может произойти.

  • Если вы используете обозначение отдельного объекта для delete на указателе, который ранее выделяется с обозначением массивов для new, поведение не определено.

Проблема может также подсветить другие ошибки кодирования. Например, вы, возможно, хотели использовать оператор delete или предыдущий оператор new на различном указателе.

Реализация Polyspace

Средство проверки отмечает дефект когда:

  • Вы выпускаете блок памяти с оператором delete, но память не была ранее выделена с оператором new.

  • Вы выпускаете блок памяти с оператором delete с помощью обозначения отдельного объекта, но память была ранее выделена как массив с оператором new.

Этот дефект применяется только к исходным файлам C++.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

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 без скобок при удалении массивов.

Исправление — совпадает с 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;
}

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

Группа: вспомогательная библиотека языка

Введенный в R2019a