AUTOSAR C++14 Rule A20-8-2

Для представления исключительной собственности используется std::unique_ptr

Описание

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

Для представления исключительной собственности используется std::unique_ptr.

Объяснение

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

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

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

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

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

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

Реализация 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