В языке программирования C++ auto_ptr — устаревший шаблон класса интеллектуального указателя , который был доступен в предыдущих версиях стандартной библиотеки C++ (объявлен в заголовочном файле ), который предоставляет некоторые базовые функции RAII для необработанных указателей C++ . Он был заменен классом . <memory>
unique_ptr
Шаблонный auto_ptr
класс описывает объект, который хранит указатель на один выделенный объект, гарантирующий, что объект, на который он указывает, будет автоматически уничтожен, когда управление покидает область действия. [1]
Характеристики теперь считаются неудовлетворительными: он был введен до семантики перемещенияauto_ptr
C++11 , поэтому он использует копирование для того, что должно быть сделано с перемещениями (и сбивает с толку, устанавливая скопированный-из в указатель NULL). Эта семантика копирования означает, что его нельзя использовать в контейнерах STL . [2]auto_ptr
Стандарт C++11 объявлен auto_ptr
устаревшим, его заменил unique_ptr
шаблон класса. [3] [4] auto_ptr
был полностью удален в C++17 . [5]
Для совместного владения shared_ptr
можно использовать шаблон класса. shared_ptr
был определен в C++11 и также доступен в библиотеке Boost для использования с предыдущими версиями C++. [6]
Класс auto_ptr
объявлен в ISO/IEC 14882 , раздел 20.4.5, как:
пространство имен std { шаблон < класс Y > struct auto_ptr_ref {}; шаблон < класс X > класс auto_ptr { public : typedef X element_type ; // 20.4.5.1 конструирование/копирование/уничтожение: явный auto_ptr ( X * p = 0 ) throw (); auto_ptr ( auto_ptr & ) throw (); шаблон < класс Y > auto_ptr ( auto_ptr < Y >& ) throw (); auto_ptr & оператор = ( auto_ptr & ) throw (); шаблон < класс Y > auto_ptr & оператор = ( auto_ptr < Y >& ) throw (); auto_ptr & оператор = ( auto_ptr_ref < X > ) throw (); ~ auto_ptr () throw (); // 20.4.5.2 члены: X & оператор * () const throw (); X * оператор -> () const throw (); X * get () const throw (); X * release () throw (); void reset ( X * p = 0 ) throw (); // 20.4.5.3 преобразования: auto_ptr ( auto_ptr_ref <X> ) throw ( ) ; шаблон < классY > оператор auto_ptr_ref <Y> ( ) throw ( ); шаблон < классY > оператор auto_ptr <Y> () throw ( ) ; } ; }
Имеет auto_ptr
семантику строгого владения, что означает, что auto_ptr
экземпляр является единственной сущностью, ответственной за время жизни объекта. Если auto_ptr
копируется, источник теряет ссылку. Например:
#include <iostream> #include <memory> using namespace std ; int main ( int argc , char ** argv ) { int * i = new int ; auto_ptr < int > x ( i ); auto_ptr < int > y ; y = x ; cout << x.get ( ) << endl ; // Вывести NULL cout << y.get () << endl ; // Вывести ненулевой адрес i вернуть 0 ; }
Этот код выведет адрес NULL для первого auto_ptr
объекта и некоторый ненулевой адрес для второго, показывая, что исходный объект потерял ссылку во время присваивания ( =
). Необработанный указатель i
в примере не должен удаляться, так как он будет удален , которому auto_ptr
принадлежит ссылка. Фактически, new int
можно было бы передать напрямую в x
, что исключит необходимость в i
.
Обратите внимание, что объект, на который указывает an, auto_ptr
уничтожается с помощью operator delete
; это означает, что вы должны использовать только auto_ptr
для указателей, полученных с помощью operator new
. Это исключает указатели, возвращаемые malloc/calloc/realloc
, и указатели на массивы (поскольку массивы выделяются и должны быть освобождены ).operator new[]
operator delete[]
Из-за семантики копирования auto_ptr
не может использоваться в контейнерах STL, которые могут выполнять копирование элементов в своих операциях.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )