可以将scoped_ptr和shared_ptr混合使用吗?

时间:2010-09-02 09:59:16

标签: c++ boost smart-pointers

想象一下,我在方法/函数中在堆上创建了一个Foo实例,并将其传递给调用者。我会使用什么样的智能指针?

smartptr new_foo() {
    smartptr foo = new Foo();
    return foo;
}

void bar() {
    smartptr foo = new_foo();
    foo->do_something();
    // now autodelete foo, don't need it anymore
}

好的......现在:据我所知,来自boost的那些智能指针,scoped_ptr应该是bar()中使用的那个。但我无法在foo()中创建它,因为它不可复制。所以我必须在foo()中创建一个shared_ptr并返回它。但是我现在必须在bar()中使用shared_ptr,还是可以将它“转换”为bar()中的shared_ptr?

修改

到目前为止,感谢您的回答!所以现在我有两个解决方案:

  • 仅使用boost::shared_ptr
  • 在生成器foo()中使用std::auto_ptr,在栏中使用boost::shared_ptr()

此致,我更喜欢仅限提升解决方案,不会将其与STL混合使用,除非有充分理由这样做。那么,接下来的问题:混合解决方案任何的优势超过仅限提升解决方案吗?

2 个答案:

答案 0 :(得分:2)

提升文档建议他们不要混用

如果您要转让所有权,那么目前另一种选择是auto_ptr例如。

smartptr new_foo() { 
    std::auto_ptr<Foo> foo = new Foo(); 
    return foo; 
} 

void bar() { 
    std::auto_ptr<Foo> foo = new_foo(); 
    foo->do_something(); 
    // now autodelete foo, don't need it anymore 
} 

然而,这将限制你如何使用new_foo(),即你不能用它来填充容器(不用其他方式管理资源)。 :(

使用C ++ 0x和rvalue引用,这将是unique_ptr的一个工作,它将替换auto_ptr并且只是做你想做的事情

答案 1 :(得分:1)

使用boost::shared_ptr