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


Класс CAutoPtr

Этот класс представляет объект интеллектуального указателя.

Важно!

Этот класс и его члены нельзя использовать в приложениях, выполняемых в среде выполнения Windows.

Синтаксис

template <typename T>
class CAutoPtr

Параметры

T
Тип указателя.

Участники

Открытые конструкторы

Имя Описание
CAutoPtr::CAutoPtr Конструктор.
CAutoPtr::~CAutoPtr Деструктор

Открытые методы

Имя Описание
CAutoPtr::Attach Вызовите этот метод для владения существующим указателем.
CAutoPtr::Detach Вызовите этот метод, чтобы освободить владение указателем.
CAutoPtr::Free Вызовите этот метод для удаления объекта, на который указывает объект CAutoPtr.

Общедоступные операторы

Имя Описание
CAutoPtr::operator T* Оператор приведения.
CAutoPtr::operator = Оператор присваивания .
CAutoPtr::operator -> Оператор указателя на член.

Общедоступные члены данных

Имя Описание
CAutoPtr::m_p Переменная элемента данных указателя.

Замечания

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

Кроме того, CAutoPtrконструктор копирования и оператор назначения передают владение указателем, копируя исходный указатель на целевой указатель и устанавливая исходный указатель на ЗНАЧЕНИЕ NULL. Поэтому невозможно иметь два CAutoPtr объекта, хранящие один и тот же указатель, и это уменьшает возможность удаления одного указателя дважды.

CAutoPtr также упрощает создание коллекций указателей. Вместо создания класса коллекции и переопределения деструктора проще сделать коллекцию CAutoPtr объектов. При удалении CAutoPtr коллекции объекты будут выходить из область и автоматически удалять себя.

CHeapPtr и варианты работают так же, как CAutoPtrи , за исключением того, что они выделяют и освобождают память с помощью разных функций кучи вместо C++ new и delete операторов. CAutoVectorPtrаналогичноCAutoPtr, единственное различие заключается в том, что он использует вектор new[] и vector delete[] для выделения и свободного памяти.

См. также CAutoPtrArray и CAutoPtrList сведения о необходимых массивах или списках смарт-указателей.

Требования

Заголовок: atlbase.h

Пример

// A simple class for demonstration purposes

class MyClass 
{
   int iA;
   int iB;
public:
   MyClass(int a, int b);
   void Test();
};

MyClass::MyClass(int a, int b)
{
   iA = a;
   iB = b;
}

void MyClass::Test()
{
   ATLASSERT(iA == iB);
}

// A simple function

void MyFunction(MyClass* c)
{
   c->Test();
}

int UseMyClass()
{
   // Create an object of MyClass.
   MyClass *pMyC = new MyClass(1, 1);

   // Create a CAutoPtr object and have it take
   // over the pMyC pointer by calling Attach.
   CAutoPtr<MyClass> apMyC;
   apMyC.Attach(pMyC);

   // The overloaded -> operator allows the 
   // CAutoPtr object to be used in place of the pointer.
   apMyC->Test();

   // Assign a second CAutoPtr, using the = operator.
   CAutoPtr<MyClass> apMyC2;
   apMyC2 = apMyC;

   // The casting operator allows the
   // object to be used in place of the pointer.
   MyFunction(pMyC);
   MyFunction(apMyC2);

   // Detach breaks the association, so after this
   // call, pMyC is controlled only by apMyC.
   apMyC2.Detach();

   // CAutoPtr destroys any object it controls when it
   // goes out of scope, so apMyC destroys the object 
   // pointed to by pMyC here.
   return 0;
}

CAutoPtr::Attach

Вызовите этот метод для владения существующим указателем.

void Attach(T* p) throw();

Параметры

p
Объект CAutoPtr будет иметь владение этим указателем.

Замечания

CAutoPtr Когда объект берет на себя владение указателем, он автоматически удаляет указатель и все выделенные данные при выходе из область. При CAutoPtr::Detach вызове программист снова несет ответственность за освобождение выделенных ресурсов.

В сборках отладки произойдет сбой утверждения, если CAutoPtr::m_p член данных в настоящее время указывает на существующее значение, то есть не равно NULL.

Пример

См. пример в обзореCAutoPtr.

CAutoPtr::CAutoPtr

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

CAutoPtr() throw();
explicit CAutoPtr(T* p) throw();

template<typename TSrc>
CAutoPtr(CAutoPtr<TSrc>& p) throw();

template<>
CAutoPtr(CAutoPtr<T>& p) throw();

Параметры

p
Существующий указатель.

TSrc
Тип, управляемый другим CAutoPtr, используемый для инициализации текущего объекта.

Замечания

Объект CAutoPtr можно создать с помощью существующего указателя, в этом случае он передает права владения указателем.

Пример

См. пример в обзореCAutoPtr.

CAutoPtr::~CAutoPtr

Деструктор

~CAutoPtr() throw();

Замечания

Освобождает все выделенные ресурсы. Вызывает CAutoPtr::Free.

CAutoPtr::Detach

Вызовите этот метод, чтобы освободить владение указателем.

T* Detach() throw();

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

Возвращает копию указателя.

Замечания

Освобождает владение указателем, задает CAutoPtr::m_p переменную члена данных значение NULL и возвращает копию указателя. После вызова Detachпрограммист должен освободить все выделенные ресурсы, над которым CAutoPtr объект мог ранее нести ответственность.

Пример

См. пример в обзореCAutoPtr.

CAutoPtr::Free

Вызовите этот метод для удаления объекта, на который указывает объект CAutoPtr.

void Free() throw();

Замечания

Объект, на который указывает CAutoPtr освобожден, и CAutoPtr::m_p переменная члена данных имеет значение NULL.

CAutoPtr::m_p

Переменная элемента данных указателя.

T* m_p;

Замечания

Эта переменная-член содержит сведения указателя.

CAutoPtr::operator =

Оператор присваивания .

template<>
CAutoPtr<T>& operator= (CAutoPtr<T>& p);

template<typename TSrc>
CAutoPtr<T>& operator= (CAutoPtr<TSrc>& p);

Параметры

p
Указатель.

TSrc
Тип класса.

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

Возвращает ссылку на объект CAutoPtr< T >.

Замечания

Оператор присваивания отсоединяет CAutoPtr объект от любого текущего указателя и присоединяет новый указатель на pего место.

Пример

См. пример в обзореCAutoPtr.

CAutoPtr::operator ->

Оператор указателя на член.

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

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

Возвращает значение переменной CAutoPtr::m_p члена данных.

Замечания

Этот оператор используется для вызова метода в классе, на который указывает CAutoPtr объект. В отладочных сборках происходит сбой утверждения, если CAutoPtr указывает на ЗНАЧЕНИЕ NULL.

Пример

См. пример в обзореCAutoPtr.

CAutoPtr::operator T*

Оператор приведения.

operator T* () const throw();

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

Возвращает указатель на тип данных объекта, определенный в шаблоне класса.

Пример

См. пример в обзореCAutoPtr.

См. также

Класс CHeapPtr
Класс CAutoVectorPtr
Общие сведения о классе