Шаг 64.
Библиотека STL. Вспомогательные средства. Класс auto_ptr. Неправильное использование класса auto_ptr
На этом шаге мы рассмотрим, в каких случаях этот класс не используется.
Тип auto_ptr создавался для вполне определенных целей, а именно для предотвращения утечки ресурсов при обработке
исключений. К сожалению, в прошлом принципы работы auto_ptr изменялись, а стандартная библиотека не содержит других
умных указателей, поэтому программисты часто неправильно используют auto_ptr. Ниже приведены рекомендации, которые
помогут предотвратить ошибки с применением auto_ptr.
- Указатели auto_ptr не могут совместно владеть объектами. Экземпляр auto_ptr
не должен ссылаться на объект, принадлежащий другому экземпляру auto_ptr (или другому объекту). В противном случае,
если объект будет удален первым указателем, второй указатель начнет ссылаться на уничтоженный объект и любые попытки чтения
или записи приведут к катастрофе.
- Тип auto_ptr не поддерживает массивы. Запрещено использовать тип auto_ptr
для ссылок на массивы. Дело в том, что объект auto_ptr для принадлежащего ему объекта вызывает оператор
delete, а не delete []. В стандартной библиотеке C++ не существует аналогичного класса, поддерживающего
семантику auto_ptr для массивов. Вместо этого в библиотеку включены контейнерные классы для работы с наборами данных.
- Тип auto_ptr не является "универсально умным" указателем. Тип auto_ptr не
предназначен для других проблем, при решении которых применяются умные указатели. В частности, auto_ptr не подходит
для подсчета ссылок (указатели с подсчетом ссылок гарантируют, что объект будет уничтожен только после удаления последнего из
нескольких умных указателей, ссылающихся на объект).
- Тип auto_ptr не отвечает требованиям к элементам контейнеров. Тип auto_ptr
не удовлетворяет одному из основных требований к элементам стандартных контейнеров, а именно: после копирования или
присваивания auto_ptr источник и приемник не эквивалентны. Присваивание или копирование объекта auto_ptr приводит
к модификации экземпляра-источника, потому что операция фактически передает значение, вместо того чтобы его копировать.
Следовательно, объекты auto_ptr не могут использоваться в качестве элементов стандартных контейнеров. К счастью,
архитектура языка и библиотеки предотвращает эту ошибку при компиляции в среде, соответствующей стандарту.
К сожалению, неправильное применение auto_ptr в отдельных случаях работает, из-за этого неконстантные объекты auto_ptr
потенциально так же опасны, как обычные указатели. Возможно, вам повезет, и неправильное использование
auto_ptr не приведет к сбою, но на самом деле это скорее невезение, чем везение, - вы даже не узнаете о том, что допустили
ошибку.
Реализация умных указателей для подсчета ссылок будет рассмотрена позже. Такие указатели удобны при совместном использовании
элементов в разных контейнерах.
На следующем шаге мы рассмотрим примеры использования класса auto_ptr.
Предыдущий шаг
Содержание
Следующий шаг