На этом шаге мы рассмотрим использование в функциях типа auto_ptr.
Из механизма передачи права владения следует возможность особого применения указателей auto_ptr: оии
могут использоваться функциями для передачи права владения другим функциям. Возможны два разных сценария.
- Функция является приемником данных. Это происходит в том случае, если auto_ptr передается
функции по значению. В этом случае параметр вызванной функции становится владельцем auto_ptr.
Следовательно, если функция не произведет обратной передачи, объект будет удален при выходе из функции:void sink(std::auto_ptr<ClassA>): // sink() получает право владения
- Функция является источником данных. При возврате из auto_ptr право владения
возвращаемого значения передается вызвавшей функции. Методика продемонстрирована в следующем примере:std::auto_ptr<ClassA> f() { std::auto_ptr<ClassA> ptr(new ClassA); // ptr становится владельцем // нового объекта . . . . . return ptr; // Право владения возвращается на сторону вызова } void g() { std::auto_ptr<ClassA> p; for (int i=0; i<10; ++i) { p = f(); // p становится владельцем возвращаемого объекта // (предыдущий возвращенный объект уничтожается). . . . . } } // Удаление последнего объекта, принадлежащего р
При каждом вызове функция f() создает объект оператором new и возвращает его (вместе с правом владения) вызывающей стороне.
В результате присваивания значения, возвращаемого функцией, право владения передается переменной р. При
второй, третьей и последующих итерациях присваивание р уничтожает объект, ранее принадлежавший р.
Выход из g(), а следовательно уничтожение р, приводит к уничтожению последнего объекта,
принадлежащего р. В любом случае утечка ресурсов невозможна. Даже при возникновении исключения
экземпляр auto_ptr, владеющий объектом, обеспечит его уничтожение.
На следующем шаге мы рассмотрим особенности использования auto_ptr.