AUTOSAR C++14 Rule A18-1-3

Станд.:: auto_ptr не должен использоваться

Описание

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

Станд.:: auto_ptr не должен использоваться.

Объяснение

std::auto_ptr тип шаблона класса, который предшествует введению семантики перемещения на C++ 11 стандартов языка. Когда вы копируете источник std::auto_ptr объект в целевой объект, исходный объект изменяется. Компилятор передает владение ресурсов в исходном объекте к целевому объекту и устанавливает исходный объект на нулевого указателя. Из-за этого необычного синтаксиса копии с помощью исходного объекта после того, как операция копии может привести к неожиданному поведению. Рассмотрите этот фрагмент кода где использование std::auto_ptr результаты в отказе сегментации.

void func(auto_ptr<int> p) {
	cout<<*p;
	//...
}

int main()
{
	std::auto_ptr<int> s = new int(1);
	//..
	func(s); // This call makes s a null-pointer
	//...
	func(s); // exception, because s is null
	return 1;
}

Первый вызов func() копирует источник std::auto_ptr объекты к аргументу p, владение передач указателя на p, и наборы s к нулевому указателю. Когда func() называется снова, компилятор пытается получить доступ к нулевому указателю s, порождение отказа сегментации.

std::auto_ptr текстовые объекты также несовместимы с любым типовым кодом, который ожидает, что операция копии не будет делать недействительным исходный объект, такой как стандартная библиотека шаблонов (STL). Избегайте использования std::auto_ptr. Это удержано от использования на C++ 11 и удалено из C++ 17. C++ 11 стандартов языка вводит std::unique_ptr как более безопасная замена для std::auto_ptr. Используйте std::unique_ptr вместо std::auto_ptr.

Реализация Polyspace

Polyspace® отмечает все экземпляры std::auto_ptr в вашем коде, кроме тех в C разрабатывают массивы.

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

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

Примеры

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

Этот код показывает, как Polyspace отмечает std::auto_ptr в вашем коде.

#include <cstdint>
#include <memory>
#include <vector>
#define AUTOPTROF(_TYPE) std::auto_ptr<_TYPE>
AUTOPTROF(int) v_int;                           // Noncompliant
typedef struct {
	std::auto_ptr<bool> vb;                     // Noncompliant
} T;
T vec; 
typedef std::auto_ptr<int> my_int_auto_ptr;     // Noncompliant
void Fn() noexcept
{
      
	std::auto_ptr<std::int32_t> ptr1(new std::int32_t(10)); // Noncompliant
	std::unique_ptr<std::int32_t> ptr2 =
	std::make_unique<std::int32_t>(10);         // Compliant
	std::vector<std::auto_ptr<std::int32_t>> v;  // Noncompliant
}

int main(){
	//..
}

Polyspace отмечает std::auto_ptr объекты. Используйте std::unique_ptr вместо std::auto_ptr.

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

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