exponenta event banner

Правило AUTOSAR C++ 14 A18-5-1

Функции malloc, calloc, realloc и free не должны использоваться

Описание

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

Функции malloc, calloc, realloc и free не должны использоваться.

Объяснение

Выделение и освобождение памяти в стиле C с использованием malloc, calloc, realloc, или free не является безопасным типом и не вызывает конструкторы/деструктор класса для создания/удаления объектов.

Например, malloc выделяет память объекту и возвращает указатель на выделенную память типа void*. Затем программа может неявно привести возвращенный указатель к другому типу, который может не соответствовать предполагаемому типу объекта.

Использование этих функций распределения и освобождения может привести к неопределенному поведению, если:

  • Вы используете free для освобождения памяти, выделенной оператором new.

  • Используется оператор delete для освобождения памяти, выделенной malloc, calloc, или realloc.

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#include <cstdint>
#include <cstdlib>

void func()
{

    std::int32_t* p1 = static_cast<std::int32_t*>(malloc(sizeof(std::int32_t))); // Non-compliant
    *p1 = 0;

    free(p1); // Non-compliant

    std::int32_t* p2 = new std::int32_t(0); // Compliant

    delete p2; // Compliant
}

В этом примере выделение памяти для указателя p1 использование malloc и освобождение памяти с использованием free не соответствуют требованиям. Эти операции небезопасны. Вместо этого используйте операторы new и delete для выделения и освобождения памяти.

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

Группа: 18 Библиотека языковой поддержки
Категория: Обязательно, Автоматизировано
Представлен в R2019b