C++ 3d.Комментарии


auto_ptr - часть 2


// разрушающее копирование из auto_ptr template<class Y> operator auto_ptr<Y>() throw(); };

Назначение auto_ptr_ref -- обеспечить семантику разрушающего копирования, ввиду чего копирование константного auto_ptr становится невозможным. Конструктор-шаблон и оператор присваивания-шаблон обеспечивают возможность неявного пребразования auto_ptr<D> в auto_ptr<B> если D* может быть преобразован в B*, например: void g(Circle* pc) { auto_ptr<Circle> p2 = pc; // сейчас p2 отвечает за удаление

auto_ptr<Circle> p3 = p2; // сейчас p3 отвечает за удаление, // а p2 уже нет

p2->m = 7; // ошибка программиста: p2.get()==0

Shape* ps = p3.get(); // извлечение указателя

auto_ptr<Shape> aps = p3; // передача прав собственности и // преобразование типа

auto_ptr<Circle> p4 = pc; // ошибка: теперь p4 также отвечает за удаление }

Эффект от использования нескольких auto_ptr для одного и того же объекта неопределен; в большинстве случаев объект будет уничтожен дважды, что приведет к разрушительным результатам.

Следует отметить, что семантика разрушающего копирования не удовлетворяет требованиям к элементам стандартных контейнеров или стандартных алгоритмов, таких как sort(). Например: // опасно: использование auto_ptr в контейнере void h(vector<auto_ptr<Shape> >& v) { sort(v.begin(),v.end()); // не делайте так: элементы не будут отсортированы }

Понятно, что auto_ptr не является обычным "умным" указателем, однако он прекрасно справляется с предоставленной ему ролью -- обеспечивать безопасную относительно исключений работу с автоматическими указателями, и делать это без существенных накладных расходов.




Начало  Назад  Вперед