Использование std::auto_ptr не допускается
Использование std::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 объект s к аргументу 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 ® помечает все экземпляры std::auto_ptr в коде, отличном от массивов стиля C.
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Библиотека поддержки языка |
| Категория: Обязательно, Автоматизировано |