Поделиться через


Класс auto_ptr

Заключает в оболочку интеллектуальный указатель вокруг ресурса, что гарантирует, что ресурс будет удален автоматически, когда точка управления выходит за пределы блока.

Начиная с C++11, используйте unique_ptr вместо auto_ptrнего. Дополнительные сведения см unique_ptr . в классе. auto_ptr не рекомендуется использовать C++11 и удален в C++17.

Дополнительные сведения о throw() и об обработке исключений см. в статье Спецификации исключений.

Синтаксис

class auto_ptr {
    typedef Type element_type;
    explicit auto_ptr(Type* ptr = 0) throw();
    auto_ptr(auto_ptr<Type>& right) throw()
        ;
    template <class Other>
    operator auto_ptr<Other>() throw();
    template <class Other>
    auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
    template <class Other>
    auto_ptr(auto_ptr<Other>& right);
    auto_ptr<Type>& operator=(auto_ptr<Type>& right);
    ~auto_ptr();
    Type& operator*() const throw();
    Type * operator->()const throw();
    Type *get() const throw();
    Type *release()throw();
    void reset(Type* ptr = 0);
};

Параметры

right
auto_ptr, из которого необходимо получить существующий ресурс.

ptr
Указатель, указанный для замены сохраненного указателя.

Замечания

Шаблон класса описывает умный указатель, который называется auto_ptrобъектом, выделенным объектом. Указатель должен быть пустым или должен обозначать объект, выделенный new. auto_ptr передает право владения, если сохраненное значение присваивается другому объекту (Он заменяет сохраненное значение после передачи указателем null.) Деструктор для auto_ptr<Type> удаления выделенного объекта. auto_ptr<Type> гарантирует, что выделенный объект автоматически удаляется при выходе точки управления за пределы блока даже с использованием созданного исключения. Не следует создавать два auto_ptr<Type> объекта, которые принадлежат одному и тому же объекту.

Вы можете передать объект auto_ptr<Type> по значению в виде аргумента в вызове функции. Не auto_ptr может быть элементом любого контейнера стандартной библиотеки. Невозможно надежно управлять последовательностью объектов с помощью контейнера стандартной auto_ptr<Type> библиотеки C++.

Участники

Конструкторы

Имя Описание
auto_ptr Конструктор для объектов типа auto_ptr.

Определения типов

Имя Описание
element_type Этот тип является синонимом для параметра шаблона Type.

Функции

Имя Описание
get Эта функция-член возвращает сохраненный указатель myptr.
release Этот член заменяет сохраненный указатель myptr на пустой указатель и возвращает сохраненный ранее указатель.
reset Эта функция-член вычисляет выражение delete myptr, но только если значение сохраненного указателя myptr изменяется после вызова функции. Затем она заменяет сохраненный указатель на ptr.

Операторы

Имя Описание
operator= Оператор присваивания, который передает право владения от одного объекта auto_ptr другому.
operator* Оператор удаления ссылки для объектов типа auto_ptr.
operator-> Оператор для разрешения доступа к членам.
operator auto_ptr<Other> Приводит из одного вида auto_ptr в другой вид auto_ptr.
operator auto_ptr_ref<Other> Приводит из auto_ptr в auto_ptr_ref.

auto_ptr

Конструктор для объектов типа auto_ptr.

explicit auto_ptr(Type* ptr  = 0) throw();

auto_ptr(auto_ptr<Type>& right) throw();

auto_ptr(auto _ptr_ref<Type> right) throw();

template <class Other>
auto _ptr(auto _ptr<Other>& right) throw();

Параметры

ptr
Указатель на объект, который инкапсулирует auto_ptr.

right
Объект auto_ptr для копирования конструктором.

Замечания

Первый конструктор хранится ptr в myptr, хранящийся указатель на выделенный объект. Второй конструктор передает право владения указателем, сохраненным в right, сохраняя right. выпуск в myptr.

Третий конструктор ведет себя так же, как второй, за исключением того, что он хранит right. ref. release in myptr, где ref находится ссылка, хранящейся в right.

Конструктор шаблона ведет себя так же, как второй конструктор, если указатель Other может быть неявно преобразован в указатель на указатель Type.

Пример

// auto_ptr_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;

class Int
{
public:
   Int(int i)
   {
      cout << "Constructing " << ( void* )this  << endl;
      x = i;
      bIsConstructed = true;
   };
   ~Int( )
   {
      cout << "Destructing " << ( void* )this << endl;
      bIsConstructed = false;
   };
   Int &operator++( )
   {
      x++;
      return *this;
   };
   int x;
private:
   bool bIsConstructed;
};

void function ( auto_ptr<Int> &pi )
{
   ++( *pi );
   auto_ptr<Int> pi2( pi );
   ++( *pi2 );
   pi = pi2;
}

int main( )
{
   auto_ptr<Int> pi ( new Int( 5 ) );
   cout << pi->x << endl;
   function( pi );
   cout << pi->x << endl;
}
Constructing 00311AF8
5
7
Destructing 00311AF8

element_type

Этот тип является синонимом для параметра шаблона Type.

typedef Type element  _type;

get

Эта функция-член возвращает сохраненный указатель myptr.

Type *get() const throw();

Возвращаемое значение

Сохраненный указатель myptr.

Пример

// auto_ptr_get.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;

class Int
{
public:
   Int(int i)
   {
      x = i;
      cout << "Constructing " << ( void* )this  << " Value: " << x << endl;
   };
   ~Int( )
   {
      cout << "Destructing " << ( void* )this << " Value: " << x << endl;
   };

   int x;

};

int main( )
{
   auto_ptr<Int> pi ( new Int( 5 ) );
   pi.reset( new Int( 6 ) );
   Int* pi2 = pi.get ( );
   Int* pi3 = pi.release ( );
   if (pi2 == pi3)
      cout << "pi2 == pi3" << endl;
   delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6

operator=

Оператор присваивания, который передает право владения от одного объекта auto_ptr другому.

template <class Other>
    auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
auto_ptr<Type>& operator=(auto_ptr<Type>& right) throw();
auto_ptr<Type>& operator=(auto_ptr_ref<Type> right) throw();

Параметры

right
Объект типа auto_ptr.

Возвращаемое значение

Ссылка на объект типа auto_ptr<Type>.

Замечания

Назначение вычисляет выражение delete myptr, но только в том случае, если сохраненный указатель myptr изменяется в результате назначения. Затем он передает права владения указателем, хранящимся в праве, сохраняя право.release в myptr; Функция возвращает *this.

Пример

Пример использования оператора-члена см. в разделе auto_ptr.

operator*

Оператор удаления ссылки для объектов типа auto_ptr.

Type& operator*() const throw();

Возвращаемое значение

Ссылка на объект типа Type , принадлежащий указателю.

Замечания

Оператор косвенного обращения возвращает *get. Следовательно, сохраненный указатель не должен быть пустым.

Пример

Пример использования функции-члена см. в разделе auto_ptr.

operator->

Оператор для разрешения доступа к членам.

Type * operator->() const throw();

Возвращаемое значение

Член объекта, auto_ptr которому принадлежит.

Замечания

Оператор выбора возвращает get( )значение, чтобы выражение>apmember работало так же, как (ap). get() )->member, где ap находится объект классаTypeauto_ptr<>. Поэтому хранимый указатель не должен иметь значение NULL и Type должен быть классом, структурой или типом объединения с элементом member .

Пример

Пример использования функции-члена см. в разделе auto_ptr.

operator auto_ptr<Other>

Приводит из одного вида auto_ptr в другой вид auto_ptr.

template <class Other>
operator auto _ptr<Other>() throw();

Возвращаемое значение

Оператор приведения типов возвращает auto_ptr<значение Other>(*this).

Пример

// auto_ptr_op_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;
int main()
{
   auto_ptr<int> pi ( new int( 5 ) );
   auto_ptr<const int> pc = ( auto_ptr<const int> )pi;
}

operator auto_ptr_ref<Other>

Приводит из auto_ptr в auto_ptr_ref.

template <class Other>
operator auto _ptr  _ref<Other>() throw();

Возвращаемое значение

Оператор приведения типов возвращает auto_ptr_refOther<>(*this).

Пример

// auto_ptr_op_auto_ptr_ref.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;

class C {
public:
    C(int _i) : m_i(_i) {
    }
    ~C() {
        cout << "~C:  " << m_i << "\n";
    }
    C &operator =(const int &x) {
        m_i = x;
        return *this;
    }
    int m_i;
};
void f(auto_ptr<C> arg) {
};
int main()
{
    const auto_ptr<C> ciap(new C(1));
    auto_ptr<C> iap(new C(2));

    // Error: this implies transfer of ownership of iap's pointer
    // f(ciap);
    f(iap); // compiles, but gives up ownership of pointer

            // here, iap owns a destroyed pointer so the following is bad:
            // *iap = 5; // BOOM

    cout << "main exiting\n";
}
~C:  2
main exiting
~C:  1

release

Этот член заменяет сохраненный указатель myptr на пустой указатель и возвращает сохраненный ранее указатель.

Type *release() throw();

Возвращаемое значение

Ранее сохраненный указатель.

Замечания

Этот член заменяет сохраненный указатель myptr на пустой указатель и возвращает сохраненный ранее указатель.

Пример

// auto_ptr_release.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;

class Int
{
public:
    Int(int i)
    {
        x = i;
        cout << "Constructing " << (void*)this << " Value: " << x << endl;
    };
    ~Int() {
        cout << "Destructing " << (void*)this << " Value: " << x << endl;
    };

    int x;

};

int main()
{
    auto_ptr<Int> pi(new Int(5));
    pi.reset(new Int(6));
    Int* pi2 = pi.get();
    Int* pi3 = pi.release();
    if (pi2 == pi3)
        cout << "pi2 == pi3" << endl;
    delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6

reset

Функция-член вычисляет выражение delete myptr, но только если сохраненное значение myptr указателя изменяется в результате вызова функции. Затем она заменяет сохраненный указатель на ptr.

void reset(Type* ptr = 0);

Параметры

ptr
Указатель, указанный для замены сохраненного указателя myptr.

Пример

// auto_ptr_reset.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;

class Int
{
public:
    Int(int i)
    {
        x = i;
        cout << "Constructing " << (void*)this << " Value: " << x << endl;
    };
    ~Int()
    {
        cout << "Destructing " << (void*)this << " Value: " << x << endl;
    };

    int x;
};

int main()
{
    auto_ptr<Int> pi(new Int(5));
    pi.reset(new Int(6));
    Int* pi2 = pi.get();
    Int* pi3 = pi.release();
    if (pi2 == pi3)
        cout << "pi2 == pi3" << endl;
    delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6

См. также

unique_ptr Class