AUTOSAR C++14 Rule A18-5-3

Форма оператора удаления должна совпадать с формой нового оператора, используемого для выделения памяти

Описание

Определение правила

Форма оператора удаления должна совпадать с формой нового оператора, используемого для выделения памяти.

Объяснение

  • The 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[]. 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;
}

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

Группа: Библиотека языковой поддержки
Категория: Необходимый, Автоматизированный
Введенный в R2019a