Ваш пример безопасен так, как вы его написали.Однако вы можете сделать его еще более герметичным, если ваш фабричный метод createFoo()
возвращает автоматический указатель вместо необработанного указателя.Таким образом, вы гарантированно, что не будет никаких утечек.
Итак, вы получите:
#include <memory>
#include <tr1/memory>
std::auto_ptr<Foo> createFoo()
{
return std::auto_ptr<Foo>(new Foo(5));
}
int main()
{
std::tr1::shared_ptr<Foo> bar(createFoo());
return 0;
}
Конечно, также возможно, чтобы ваш фабричный метод возвратил shared_ptr, но это может рассматриваться как избыточное, так как возвращаемый указателькак правило, довольно быстро выйдет из области видимости, поскольку будет использоваться в присваивании или конструкторе.Кроме того, использование auto_ptr более четко указывает намеченное использование указателя, что всегда является плюсом, когда люди, незнакомые с вашим кодом, должны его понять.