exponenta event banner

Правило AUTOSAR C++ 14 A20-8-3

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

Описание

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

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

Объяснение

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

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

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

A 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