Описание тега smart-pointers
Умные указатели - это объекты, которые выглядят и выглядят как указатели, но являются более интеллектуальными.
Что это значит? Чтобы выглядеть и восприниматься как указатели, интеллектуальные указатели должны иметь тот же интерфейс, что и указатели: они должны поддерживать операции с указателями, такие как разыменование (оператор*
) и косвенное обращение (оператор ->
). Объект, который выглядит и ощущается как что-то еще, называется прокси-объектом или просто прокси. Шаблон прокси и его многочисленные применения описаны в книгах "Шаблоны проектирования" и "Архитектура программного обеспечения, ориентированная на шаблоны".
Чтобы быть умнее обычных указателей, интеллектуальные указатели должны делать то, чего не делают обычные указатели. Что это могло быть? Вероятно, наиболее распространенные ошибки в C++ (и C) связаны с указателями и управлением памятью: висячие указатели, утечки памяти, сбои при распределении и другие радости. Умный указатель, который позаботится об этих вещах, может сэкономить много аспирина...
Самый простой пример умного указателя: auto_ptr
, который входит в стандартную библиотеку C++ (C++03). Вы можете найти это в шапке<memory>
, или взгляните на Скотта Мейерса auto_ptr
реализация. Вот соответствующие частиauto_ptr
реализация, чтобы проиллюстрировать, что она делает:
template <class T> class auto_ptr
{
T* ptr;
public:
explicit auto_ptr(T* p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
T& operator*() {return *ptr;}
T* operator->() {return ptr;}
// ...
};
Как показано, auto_ptr
представляет собой простую оболочку вокруг обычного указателя. Он пересылает на этот указатель все значимые операции (разыменование и косвенное обращение). Его "умение" заключается в деструкторе: деструктор позаботится об удалении указателя.
Для пользователя auto_ptr
, это означает, что вместо записи:
void foo()
{
MyClass* p(new MyClass);
p->DoSomething();
delete p;
}
Ты можешь написать:
void foo()
{
auto_ptr<MyClass> p(new MyClass);
p->DoSomething();
}
И верь p
убирать за собой.
Интеллектуальные указатели являются частью идиоматической техники RAII (Resource Acquisition Is Initialisation), которая лежит в основе управления ресурсами в C++.
Ссылки: