想象一下,我在方法/函数中在堆上创建了一个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
std::auto_ptr
,在栏中使用boost::shared_ptr
()此致,我更喜欢仅限提升解决方案,不会将其与STL混合使用,除非有充分理由这样做。那么,接下来的问题:混合解决方案任何的优势超过仅限提升解决方案吗?
答案 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