Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

См. Также [ править ]

Ссылки [ править ]

  1. ^ "Класс auto_ptr" . Microsoft . Проверено 27 сентября 2006 . CS1 maint: обескураженный параметр ( ссылка )
  2. ^ "Рабочий проект стандарта языка программирования C ++ N3242" (PDF) . 28 февраля 2011. с. 1233 . Проверено 17 февраля 2013 . CS1 maint: обескураженный параметр ( ссылка )
  3. ^ Калев, Дэнни. «Использование unique_ptr, часть I» . informIT . Проверено 30 сентября 2010 года . CS1 maint: обескураженный параметр ( ссылка )
  4. ^ "Язык программирования C ++, Рабочая группа по развитию библиотек JTC1 / SC22 / WG21 N4190" . 2014-10-09 . Проверено 29 августа 2016 . CS1 maint: обескураженный параметр ( ссылка )
  5. ^ «Сбор общих объектов» . Доктора Добба. 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