AUTOSAR C++14 Rule A20-8-3

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

Описание

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

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

Объяснение

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

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

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

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

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

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

Несмотря на то, что std::shared_ptr объект имеет немного служебные по необработанному указателю, использование этого объекта избегает возможных утечек памяти позже.

Реализация Polyspace

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

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

  • Если вы хотите, чтобы функция взяла исключительное владение резкого объекта, преобразуйте необработанный указатель на 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::shared_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_shared<Resource>();
    bool valueFound, allSmallerValuesFound;
    
    //Initialize resources
    
    valueFound = doesValueExist(aResourcePtr, getAVal());
    allSmallerValuesFound = doAllSmallerValuesExist(anotherResourcePtr, getAVal());
}

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

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

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

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