Является ли элемент действительно общим? То есть, после создания, вы сохраняете указатель на объект в своих целях или делаете это только для того, чтобы избежать утечек памяти пользователя?
Если память фактически не используется, я бы не использовал 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!
+1 Я забыл упомянуть в своем ответе о важности интерфейса, помогающего с семантикой: 'auto_ptr' подразумевает передачу права собственности. –
auto_ptr - это зло, особенно когда вы непреднамеренно передаете их по значению ... boost :: scoped_ptr намного лучше в этом отношении. –
@Alexandre C .: Для этого использования 'boost :: scoped_ptr' совершенно неуместно. Поскольку он не копируется, его нельзя даже использовать как возвращаемое значение. 'std :: auto_ptr' не является злом так же, как бензопила не является злом. Это просто инструменты; у них нет намерений.Просто потому, что жонглирование бензопилой очень опасно, не означает, что у них нет полезного приложения: вырубка деревьев. Существуют более стандартные способы выражения передачи права собственности в C++ 0x (например, unique_ptr - хотя, возможно, лучший интерфейс возможен только благодаря rvalue-ссылкам), но здесь по крайней мере 'std :: auto_ptr'. –