Действительно ли элемент является общим? То есть после создания вы сохраняете указатель на объект для своих собственных целей или делаете это просто для того, чтобы избежать утечек пользовательской памяти?
Если память фактически не используется совместно, я бы не использовал shared_ptr
. Обратите внимание, что используя shared_ptr
в качестве возвращаемого типа, вы заставляете использовать как динамическое выделение, так и конкретную реализацию интеллектуального указателя, но ограничивает использование стека для вашего типа и других типов интеллектуальных указателей, которые могут быть более подходящими ( вы не можете извлечь членство из общего указателя)
Если вы действительно хотите убедиться, что вызов не протекает (то есть, если пользователь вызывает вашу функцию, то возвращенная память будет обработана «как-то», вы можете использовать std::auto_ptr
или boost::unique_ptr
(последний) будучи нестандартным даже в C ++ 0x.) Оба решения позволяют вызывающему коду извлекать указатель из интеллектуального указателя и использовать другой подход к управлению памятью (даже если в некоторых случаях это может быть громоздким).
struct type {
std::auto_ptr<type> create();
};
std::auto_ptr<type> ap = type::create();
std::shared_ptr<type> sp( type::create().release() );
type::create(); // will not leak memory
type *rp = type::create().release(); // user specifically requested a raw pointer!