Класс auto_ptr C++

Класс auto_ptr (automatic pointer - автоматический указатель). Данный класс предоставляется стандартной библиотекой STL С++ и предназначен для работы с объектами, которые обычно необходимо удалять явно (например, объекты, созданные динамически с помощью оператора new).

Для создания объекта класса auto_ptr параметром конструктора должен быть указатель на объект, созданный динамически. Дальше c auto_ptr можно работать почти как с обычным указателем, который указывает на тот же динамический объект, на который указывал исходный указатель.

Синтаксис класса auto_ptr в стандартной библиотеке STL выглядит так:

template<class X>
 
class Std::auto_ptr
{
	X* ptr;
 
public:
 
	//конструктор и деструктор
 
	explicit auto_ptr(X* p = 0)throw()
	{
 
		ptr = p;
 
	}
 
	~auto_ptr() throw()
	{
 
		delete ptr;
 
	} 
 	//оператор разыменования позволяет получить объект
 
	X& operator*()const throw()
	{
 
		return *ptr;
 
	} 
       	//оператор -> позволяет получить указатель
 
	X* operator->()const throw()
	{
 
		return ptr;
 
	}
 
};
Кроме переопределения операторов → и *, класс auto_ptr содержит две функции-члена: X* get () const; - возвращает указатель на объект класса, скрывающегося под шаблоном X X* release () const; - возвращает указатель на объект класса, скрывающегося под шаблоном X, но при этом забирает у auto_ptr права на этот объект. ВНИМАНИЕ!!! Сам объект не уничтожается!!!

Рассмотрев общую конструкцию auto_ptr, полюбопытствуем, как он выглядит в работе:

#include <iostream>
#include <memory>
using namespace std;
 
class TEMP{
	public:
	TEMP(){
		cout<<"TEMP\n\n";
	}
	~TEMP(){
		cout<<"~TEMP\n\n";
	}
	void TEST(){
		cout<<"TEST\n\n";
	}
};
void main(){
	// создаём два автоматических указателя
	// под один из них выделяем память типа TEMP
	auto_ptr<TEMP>ptr1(new TEMP), ptr2;
 
	// передача права владения
	ptr2=ptr1;
 
	// вызов функции через автоматический указатель
	ptr2->TEST();
 
	// присваивание автоматического указателя
	// обычному указателю на объект класса
	TEMP*ptr=ptr2.get();
 
	// вызов функции через обычный указатель
	ptr->TEST();
}
PQ VPS сервера в 28+ странах.