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