关于shared_ptr - C++用法的问题

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)

任何帮助都会很棒.

rpg*_*rpg 8

大部分问题已经得到解答,但我不同意shared_ptr副本很便宜.

副本具有与传递引用不同的语义.它将修改引用计数,这将在最佳情况下触发原子增量,在最坏情况下触发锁定.您必须确定所需的语义,然后您将知道是通过引用还是通过值传递.

从性能的角度来看,使用boost指针容器而不是shared_ptr的容器通常是个更好的主意.