Nav*_*K N 17 c++ smart-pointers shared-ptr
我对使用的最佳实践几乎没有疑问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);
}
Run Code Online (Sandbox Code Playgroud)
问题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;
}
Run Code Online (Sandbox Code Playgroud)
要么
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;
}
Run Code Online (Sandbox Code Playgroud)
问题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;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒.
大部分问题已经得到解答,但我不同意shared_ptr副本很便宜.
副本具有与传递引用不同的语义.它将修改引用计数,这将在最佳情况下触发原子增量,在最坏情况下触发锁定.您必须确定所需的语义,然后您将知道是通过引用还是通过值传递.
从性能的角度来看,使用boost指针容器而不是shared_ptr的容器通常是个更好的主意.