У меня есть несколько вопросов о лучших практиках использования shared_ptr
.
Вопрос 1
Копирование shared_ptr
дешево? Или мне нужно передать его как ссылку на мои собственные вспомогательные функции и вернуть как значение? Что-то вроде
void init_fields(boost::shared_ptr<foo>& /*p_foo*/);
void init_other_fields(boost::shared_ptr<foo>& /*p_foo*/);
boost::shared_ptr<foo> create_foo()
{
boost::shared_ptr<foo> p_foo(new foo);
init_fields(p_foo);
init_other_fields(p_foo);
}
Вопрос 2
Должен ли я использовать boost::make_shared
для построения shared_ptr
? Если да, то какие преимущества он предлагает? И как мы можем использовать make_shared
, когда T
не имеет конструктора без параметров?
Вопрос 3
Как использовать const foo*
? Я нашел два подхода для этого.
void take_const_foo(const foo* pfoo)
{
}
int main()
{
boost::shared_ptr<foo> pfoo(new foo);
take_const_foo(pfoo.get());
return 0;
}
OR
typedef boost::shared_ptr<foo> p_foo;
typedef const boost::shared_ptr<const foo> const_p_foo;
void take_const_foo(const_p_foo pfoo)
{
}
int main()
{
boost::shared_ptr<foo> pfoo(new foo);
take_const_foo(pfoo);
return 0;
}
Вопрос 4
Как я могу вернуться и проверить NULL
на shared_ptr
объекте? Это что-то вроде
boost::shared_ptr<foo> get_foo()
{
boost::shared_ptr<foo> null_foo;
return null_foo;
}
int main()
{
boost::shared_ptr<foo> f = get_foo();
if(f == NULL)
{
/* .. */
}
return 0;
}
Любая помощь будет отличной.