AUTOSAR C++ 14 Rule A18-5-1

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

Описание

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

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

Объяснение

Выделение памяти 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 выделить и освободить память.

Введенный в R2019b