AUTOSAR C++ 14 Rule 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 Language Support Library
Категория: Необходимый, Автоматизированный
Введенный в R2019b