Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

klass_auto_ptr

auto_ptr

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

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

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

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();
}



klass_auto_ptr.txt · Последние изменения: 2011/02/03 11:58 (внешнее изменение)