На этом шаге мы рассмотрим использование в функциях типа auto_ptr.
Из механизма передачи права владения следует возможность особого применения указателей auto_ptr: оии могут использоваться функциями для передачи права владения другим функциям. Возможны два разных сценария.
void sink(std::auto_ptr<ClassA>): // sink() получает право владения
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.