Класс 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий