Это особенность библиотеки контейнеров указателей Boost.
Базовая push_back
функция-член определяется как:
void push_back( value_type x ) // strong
{
this->enforce_null_policy( x, "Null pointer in 'push_back()'" );
auto_type ptr( x ); // notrow
this->base().push_back( x ); // strong, commit
ptr.release(); // nothrow
}
(из заголовка ptr_sequence_adapter.hpp )
Таким образом, сама функция push_back
получает владение указателем, а в случае сбоя перераспределения берет на себя ответственность за удаление указателя.
Перегрузка push_back
, которая принимает auto_ptr
, определяется в терминах базовой push_back
функции:
template< class U >
void push_back( std::auto_ptr<U> x )
{
push_back( x.release() );
}
Указатель освобождается перед вызовом к базовому push_back
, что нормально, потому что базовая функция push_back
имеет строгую гарантию, что она удалит указатель в случае возникновения исключения.