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