AUTOSAR C++14 Rule A20-8-5

станд:: должен использоваться, чтобы создать объекты, принадлежавшие станд.:: unique_ptr.

Описание

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

станд:: должен использоваться, чтобы создать объекты, принадлежавшие станд.:: unique_ptr.

Объяснение

Вместо того, чтобы выделить память при помощи new оператор и преобразование получившегося необработанного указателя на std::unique_ptr объект, например:

class numberClass {
     numberClass(int n): number(n){}
   private: 
     int number;
}
int aNumber=1; 
std::unique_ptr<numberClass> numberPtr (new numberClass(aNumber)); 
Создайте std::unique_ptr возразите непосредственно использованию std::make_unique функция. Например:
auto numberPtr = std::make_unique<numberClass>(aNumber);

Используя std::make_unique предпочтен потому что:

  • Создание std::unique_ptr объект с помощью std::make_unique безопасно от исключения. В противном случае исключение может находиться между динамическим выделением памяти с new оператор и последующее преобразование, ведя к утечке памяти. Исключение вызывает утечку памяти только в определенных контекстах, например, когда std::unique_ptr объект создается в аргументе функции мультипараметра, и другая оценка аргумента функции выдает исключение.

  • Можно использовать более краткий синтаксис. Вы не должны повторять тип данных объекта, который динамически выделяется.

Реализация Polyspace

Средство проверки отмечает создание std::unique_ptr объект от необработанного указателя, возвращенного new оператор.

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

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

Примеры

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

#include <cstdint>
#include <string>

class Record {
    Record(std::string aName, std::string someInfo): name(aName), info(someInfo){       
    }
    private:
       std::string name;
       std::string info;
};

void addRecordToDataBase(std::unique_ptr<Record> aRecord, bool dataBaseIsFull);
bool checkDataBase(void); //Checks if database can accept more entries

void createRecord() {
    std::unique_ptr<Record> recordPtr1 (new Record("John", "Mechanic, New York")); //Noncompliant
    auto recordPtr2 = std::make_unique<Record>("Tom", "Plumber, Boston"); //Compliant
    
    addRecordToDataBase(std::unique_ptr<Record>(new Record("John", "Mechanic, New York")), checkDataBase()); //Noncompliant
    addRecordToDataBase(std::make_unique<Record>("Tom", "Plumber, Boston"), checkDataBase()); //Compliant
}

В этом примере правило нарушено каждый раз, когда new оператор возвращает необработанный указатель, и последующее преобразование создает std::unique_ptr объект от необработанного указателя.

В первом вызове addRecordToDatabase, следующая последовательность событий может произойти (до C++ 17):

  • Первая оценка аргумента. new оператор динамически выделяет память для Record объект.

  • Вторая оценка аргумента. Функциональный checkDataBase называется.

  • Продолжение первой оценки аргумента. Необработанный указатель получен из new оператор преобразован в std::unique_ptr объект.

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

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

Группа: Общая сервисная библиотека
Категория: необходимый, автоматизированный
Введенный в R2020b