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