stringtranslate.com

auto_ptr

В языке программирования 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, которые могут выполнять копирование элементов в своих операциях.

Смотрите также

Ссылки

  1. ^ "Класс auto_ptr". Microsoft . Получено 2006-09-27 .
  2. ^ Мейерс, Скотт (2014). Эффективный современный C++: 42 конкретных способа улучшить использование C++11 и C++14 . Севастополь, Калифорния. С. 118. ISBN 978-1-491-90399-5.{{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  3. ^ "Рабочий проект, стандарт языка программирования C++ N3242" (PDF) . 28 февраля 2011 г. стр. 1233 . Получено 17.02.2013 .
  4. ^ Калев, Дэнни. «Использование unique_ptr, часть I». informIT . Получено 30 сентября 2010 г.
  5. ^ "Язык программирования C++, Рабочая группа по развитию библиотек JTC1/SC22/WG21 N4190". 2014-10-09 . Получено 2016-08-29 .
  6. ^ "Сбор общих объектов". Доктор Доббс. 2004-07-01 . Получено 2006-09-27 .

Внешние ссылки