Описание тега 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++.

Ссылки:

http://ootips.org/yonat/4dev/smart-pointers.html