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;
}
Преимущества:
- передача владения имеющегося объекта (функция приемник гарантированно является единственным владельцем объекта и может управлять его временем жизни, по ее завершинию объект в первоначальном виде перестает существовать);
Типичное применение: добавление элемента в коллекцию полиморфных объектов