Auto_ptr - auto_ptr - Wikipedia

auto_ptr это класс шаблон это было доступно в предыдущих версиях Стандартная библиотека C ++ (заявлено в <memory> заголовочный файл ), который обеспечивает некоторые основные RAII особенности для Необработанные указатели C ++. Он был заменен на unique_ptr учебный класс.

В auto_ptr Класс шаблона описывает объект, который хранит указатель на один выделенный объект, который гарантирует, что объект, на который он указывает, автоматически уничтожается, когда элемент управления покидает область.[1]

В C ++ 11 стандартный сделанный 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 как:

пространство имен стандартное {    шаблон <учебный класс Y> структура auto_ptr_ref {};    шаблон <учебный класс Икс>    учебный класс auto_ptr {    общественный:        typedef Икс element_type;        // 20.4.5.1 конструкция / копирование / уничтожение:        явный           auto_ptr(Икс* п =0) бросать();                           auto_ptr(auto_ptr&) бросать();        шаблон <учебный класс Y> auto_ptr(auto_ptr<Y>&) бросать();        auto_ptr&                      оператор=(auto_ptr&) бросать();        шаблон <учебный класс Y> auto_ptr&   оператор=(auto_ptr<Y>&) бросать();        auto_ptr&                      оператор=(auto_ptr_ref<Икс>) бросать();        ~auto_ptr() бросать();        // 20.4.5.2 члены:        Икс&     оператор*() const бросать();        Икс*     оператор->() const бросать();        Икс*     получать() const бросать();        Икс*     релиз() бросать();        пустота   перезагрузить(Икс* п =0) бросать();        // 20.4.5.3 преобразования:                                    auto_ptr(auto_ptr_ref<Икс>) бросать();        шаблон <учебный класс Y> оператор auto_ptr_ref<Y>() бросать();        шаблон <учебный класс Y> оператор auto_ptr<Y>() бросать();    };}

Семантика

В auto_ptr имеет семантику строгого владения, что означает, что auto_ptr instance - единственная сущность, ответственная за время жизни объекта. Если auto_ptr копируется, источник теряет ссылку. Например:

#включают <iostream>#включают <memory>с помощью пространство имен стандартное; int главный(int argc, char **argv){    int *я = новый int;    auto_ptr<int> Икс(я);    auto_ptr<int> у;        у = Икс;        cout << Икс.получать() << конец; // Печать NULL    cout << у.получать() << конец; // Вывести ненулевой адрес i    возвращаться 0;}

Этот код напечатает НОЛЬ адрес для первого auto_ptr объект и некоторый ненулевой адрес для второго, показывая, что исходный объект потерял ссылку во время присваивания (=). Необработанный указатель я в примере не следует удалять, так как он будет удален auto_ptr которому принадлежит ссылка. Фактически, новый int можно передать прямо в Икс, устраняя необходимость в я.

Обратите внимание, что объект, на который указывает auto_ptr уничтожается с использованием оператор удалить; это означает, что вы должны использовать только auto_ptr для указателей, полученных с помощью оператор новый. Это исключает указатели, возвращаемые malloc / calloc / realloc, и указатели на массивы (поскольку массивы выделяются оператор новый[] и должен быть освобожден оператор delete []).

Благодаря семантике копирования auto_ptr не могут использоваться в контейнерах STL, которые могут выполнять копии элементов в своих операциях.

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

Рекомендации

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

внешняя ссылка