Использование std::auto_ptr не допускается
Использование std::auto_ptr не допускается.
The 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 s объекта к аргументу p, передает права собственности на указатель на p, и устанавливает s к нулевому указателю. Когда func() вызывается снова, компилятор пытается получить доступ к нулевому указателю s, вызывающий отказ сегментации.
The 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® помечает все образцы std::auto_ptr в коде, за исключением массивов в стиле С.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Библиотека языковой поддержки |
| Категория: Необходимый, Автоматизированный |