Идиома: Передача auto_ptr по значению в/из функции

Mar 01, 2006 16:53


(основана на особенности копирования экземпляров auto_ptr с использованием так называемой move semantics)
Два варианта применения:

1. Возвращение auto_ptr по значению из функции:

Вместо:

int* CreateInt() 
  { 
    return new int; 
  }

Использовать:

std::auto_ptr CreateInt()
  {
    return std::auto_ptr(new int);
  }

...
  std::auto_ptr pi = CreateInt();
  // работа с pi
  ...

Преимущества:
  - передача владения созданным в функции объектом (вызывающий гарантированно является единственным владельцем объекта и может управлять его временем жизни);
  - отсутствие необходимости явного удаления созданного в функции объекта (позволяет избежать случайных утечек памяти);

Типичное применение: фабричные функции

2. Передача auto_ptr по значению в функцию:

Вместо:

int ReleaseInt(int* pi)
  {
    int ret = *pi;
    delete pi;
    return pi;
  }

Использовать:

int ReleaseInt(std::auto_ptr pi)
  {
    return *pi;
  }

Преимущества:
  - передача владения имеющегося объекта (функция приемник гарантированно является единственным владельцем объекта и может управлять его временем жизни, по ее завершинию объект в первоначальном виде перестает существовать);

Типичное применение: добавление элемента в коллекцию полиморфных объектов
Previous post Next post
Up