auto_ptr - это шаблон класса, который был доступен в предыдущих версиях стандартной библиотеки C ++ (объявлен в <memory>
файле заголовка ), который предоставляет некоторые основные функции RAII для необработанных указателей C ++ . Он был заменен классом unique_ptr .
Класс auto_ptr
шаблона описывает объект, который хранит указатель на один выделенный объект, который обеспечивает автоматическое уничтожение объекта, на который он указывает, когда элемент управления покидает область действия. [1]
++ 11 C стандарт сделал auto_ptr
устаревшим, заменив его с unique_ptr
шаблоном класса. [2] [3] auto_ptr
был полностью удален в C ++ 17 . [4]
Для совместного владения shared_ptr
можно использовать класс шаблона. shared_ptr
был определен в C ++ 11 и также доступен в библиотеке Boost для использования с предыдущими версиями C ++. [5]
Декларация [ править ]
auto_ptr
Класс объявлен в ISO / IEC 14882 , раздел 20.4.5 , как:
namespace std { шаблон < класс Y > struct auto_ptr_ref {}; шаблон < класс X > class 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 & operator = ( auto_ptr & ) throw (); шаблон < класс Y > auto_ptr & operator = ( auto_ptr < Y > & ) throw (); auto_ptr & operator = ( auto_ptr_ref < X > ) throw (); ~ auto_ptr () throw (); // 20.4.5.2 члены: X & operator * () const throw (); X * оператор -> () const throw (); X * get () const throw (); X * release () throw (); недействительный сброс ( X * p = 0 ) throw (); // 20.4.5.3 преобразования: auto_ptr ( auto_ptr_ref < X > ) throw (); шаблон < класс Y > оператор auto_ptr_ref < Y > () throw (); шаблон < класс Y > operator auto_ptr < Y > () throw (); };}
Семантика [ править ]
auto_ptr
Имеет семантику строгой собственности, а это означает , что auto_ptr
экземпляр является единственным лицом , ответственным за жизнь объекта. Если auto_ptr
копируется, источник теряет ссылку. Например:
#include <iostream>#include <память>используя пространство имен std ; int main ( int argc , char ** argv ) { int * я = новый int ; auto_ptr < int > x ( я ); auto_ptr < int > y ; у = х ; cout << x . get () << endl ; // Вывести NULL cout << y . get () << endl ; // Вывести ненулевой адрес i возврат 0 ; }
Этот код напечатает NULL- адрес для первого auto_ptr
объекта и некоторый ненулевой адрес для второго, показывая, что исходный объект потерял ссылку во время присвоения ( =
). Необработанный указатель i
в примере не следует удалять, так как он будет удален тем auto_ptr
, кому принадлежит ссылка. Фактически, new int
может быть передан напрямую x
, что устраняет необходимость в i
.
Обратите внимание, что объект, на который указывает знак auto_ptr
, уничтожается с помощью operator delete
; это означает, что вы должны использовать только auto_ptr
указатели, полученные с помощью operator new
. Это исключает указатели, возвращаемые malloc/calloc/realloc
и указатели на массивы (потому что массивы выделяются и должны быть освобождены ).operator new[]
operator delete[]
Из-за своей семантики копирования auto_ptr
не может использоваться в контейнерах STL, которые могут выполнять копии элементов в своих операциях.
См. Также [ править ]
Ссылки [ править ]
- ^ "Класс auto_ptr" . Microsoft . Проверено 27 сентября 2006 . CS1 maint: обескураженный параметр ( ссылка )
- ^ "Рабочий проект стандарта языка программирования C ++ N3242" (PDF) . 28 февраля 2011. с. 1233 . Проверено 17 февраля 2013 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Калев, Дэнни. «Использование unique_ptr, часть I» . informIT . Проверено 30 сентября 2010 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ "Язык программирования C ++, Рабочая группа по развитию библиотек JTC1 / SC22 / WG21 N4190" . 2014-10-09 . Проверено 29 августа 2016 . CS1 maint: обескураженный параметр ( ссылка )
- ^ «Сбор общих объектов» . Доктора Добба. 2004-07-01 . Проверено 27 сентября 2006 . CS1 maint: обескураженный параметр ( ссылка )
Внешние ссылки [ править ]
- Использование auto_ptrэффективно
- Как избежать утечек памяти с помощью auto_ptr
- Статья Дэнни Калева « Использование auto_ptrшаблона класса для облегчения управления динамической памятью »
- Статья Зишана Амджада " Контейнер дляauto_ptr "
- Статья Скотта Мейерса " Обновлениеauto_ptr "
- auto_ptr Ссылка на шаблон класса из GNU libstdc ++
- auto_ptr ссылка из Rogue Wave