AUTOSAR C++14 Rule A20-8-2

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

Описание

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

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

Объяснение

Необработанные указатели на память кучи страдают от двух связанных проблем:

  • Когда необработанный указатель выходит из осциллографа, резкая память не может быть освобождена и результат в утечке памяти. Необходимо не забыть явным образом освобождать память (delete указатель), прежде чем указатель выходит из осциллографа.

  • Если вы передаете необработанный указатель на функцию, неясно, берет ли функция исключительное владение резкого ресурса и может освободить память или должна оставить освобождение вызывающей стороне. Если функция освобождает память, существует риск, что другой указатель, указывающий на ту же ячейку памяти, теперь оставляют, свисая.

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

  • Вы не должны явным образом освобождать резкую память. Память освобождена, прежде чем указатель выходит из осциллографа.

  • Указатель имеет исключительное владение резкого объекта. Когда вы передаете указатель на функцию операцией пересылки, функция принимает владение памяти через указатель и неявно освобождает память на завершении (если вы не передаете владение другой функции).

Реализация Polyspace

Средство проверки отмечает функции кроме main это имеет необработанные указатели как параметры или возвращаемые значения.

Средство проверки повышает нарушение и этого правила и AUTOSAR C++14 Rule A20-8-3.

  • Если вы хотите, чтобы функция взяла исключительное владение резкого объекта, преобразуйте необработанный указатель на std::unique_ptr ввод.

  • Если вы хотите, чтобы функция взяла совместно использованное владение резкого объекта, преобразуйте необработанный указатель на std::shared_ptr ввод.

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

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

Примеры

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

#include <memory>
#include <cstdint>
#include <thread>
constexpr std::uint32_t SIZE=100;

class Resource {
  public:
    bool lookup(std::int32_t);
  private:
    std::int32_t arr[SIZE];
};

bool doesValueExist(Resource *aResource, std::int32_t val) { //Noncompliant
    return aResource->lookup(val);
}

bool doAllSmallerValuesExist(std::unique_ptr<Resource> aResource, std::int32_t val) { 
//Compliant
    bool valueExists = true;
    for(std::int32_t i = 0; i <= val; i++) {
        valueExists = aResource->lookup(i);
        if(!valueExists)
            break;
    }
    return valueExists;
}

std::int32_t getAVal();

void main(void) {
    Resource *aResourcePtr = new Resource;
    auto anotherResourcePtr = std::make_unique<Resource>();
    bool valueFound, allSmallerValuesFound;
    
    //Initialize resources
    
    valueFound = doesValueExist(aResourcePtr, getAVal());
    allSmallerValuesFound = doAllSmallerValuesExist(std::move(anotherResourcePtr), getAVal());
}

В этом примере, функциональном doesValueExist берет необработанный указатель на Resource возразите как параметр, и нарушает правило.

Функциональный doAllSmallerValuesExist выполняет подобные операции на Resource возразите, но берет std::unique_ptr указатель на объект как параметр.

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

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