Класс auto_ptr. Источник и приемник

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



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

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