На этом шаге мы рассмотрим использование в функциях типа 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.