C++ 作用域\u ptr和共享\u ptr可以混合使用吗?

C++ 作用域\u ptr和共享\u ptr可以混合使用吗?,c++,boost,smart-pointers,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 } 好的。。。现在:据我对

假设我在一个方法/函数的堆上创建了一个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中的智能指针的理解,作用域_ptr应该是在bar()中使用的。但是我不能在foo()中创建它,因为它不可复制。所以我必须在foo()中创建一个共享的_ptr并返回它。但我现在是否必须在bar()中使用共享的_ptr,或者我可以将其“强制”到bar()中的共享_ptr

编辑

谢谢你迄今为止的回答!现在我有两个解决方案:

  • 仅使用
    boost::shared\u ptr
  • 在生成器foo()中使用
    std::auto_ptr
    ,在bar()中使用
    boost::shared_ptr

诚恳地说,我更喜欢只使用boost的解决方案,并且不会将其与STL混合使用,除非有很好的理由这样做。那么,下一个问题是:混合解决方案比纯boost解决方案有什么优势吗?

boost文档建议他们不要混合

如果您正在转让所有权,那么目前另一种选择是自动转让,例如:

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 
} 
smartptr new_foo(){
std::auto_ptr foo=new foo();
返回foo;
} 
空条({
std::auto_ptr foo=new_foo();
foo->do_something();
//现在自动删除foo,不再需要它了
} 
但是,这将限制您如何使用new_foo(),即您不能使用它来填充容器(如果不以其他方式管理资源):(


有了C++0x和右值引用,这将是unique_ptr的工作,它将取代auto_ptr,只做你想做的事。使用
boost::shared_ptr

返回
auto_ptr
不会限制你可以做什么;你可以用它初始化
shared_ptr
,或者调用
release
,做任何你想做的事情原始指针(只要您最终记得删除它)好吧,好吧,但这会限制你在不亲自管理资源的情况下所能做的事情,而这正是使用资源的第一点。或者至少你需要小心,即没有自动的容器。最好的说法是,自动的ptr有一些你需要注意的危险,unique的ptr会解决这些问题,所以
自动的ptr
在这种情况下,它比boost的smartpointers更具优势?与其说是一个更窄的用例,不如说是一个更窄的用例,它恰好符合您想要做的事情,即所有权转移而不是共享。我不确定我是否完全理解您的意思。您能解释一下吗?在第一个示例中,您返回的是包装对象,因此您不需要o在被调用方和调用方之间“共享”目标对象的所有权。实例化并返回封装在boost::shared_ptr中的对象将完全做到这一点,将所有权从被调用方干净地转移到调用方。在第二个示例中,不需要所有权转移,因为目标对象是局部作用域的,因此更简单的作用域_ptr是合适的ate-使您的代码异常安全,smartptr包装中没有不必要的函数。@Dennis Z-您是对的,我错误地将代码理解为两个解耦函数。boost::shared_ptr是唯一对我有意义的。谢谢您的更正,编辑了我的原始答案。