Класс 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
( )
значение, чтобы выражение>ap
member
работало так же, как (ap
). get
() )->member
, где ap
находится объект классаType
auto_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