我有一个项目,我想更多地使用智能指针。总的来说,我已经成功地实现了这个目标。但是,我遇到了一件事,我不确定“最佳做法”是什么。
基本上我想从函数返回一个“指针”,但要求用户将它保存在一个智能指针中。不仅如此,我不想强制使用特定的智能指针(共享与作用域)。
问题主要在于似乎没有将 scoped_ptr
升级为 shared_ptr
的正确方法(我认为这将是理想的解决方案)。我理解他们为什么不这样做,因为这将允许所有权转移,这可能会导致一些问题,例如 std::auto_ptr
。
但是,转让所有权对于这个案例来说似乎是个好主意。所以我的想法是这样的:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
这“没问题”,因为 scoped_ptr
和 shared_ptr
都有从 std::auto_ptr
获取所有权的构造函数。
所以我的问题是,这是好的做法吗?有更好的解决方案吗?我能想到的唯一真正的替代方法是使用模板模板作为返回值,如下所示:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
这实际上可以很好地工作,除了我认为它也需要一些工作才能让它与 scoped_ptr
一起工作。
想法?
最佳答案
使用std::auto_ptr
是 好的做法,事实上such example被建议
作者:Bjarne Stroustrup。
auto_ptr
的移动语义为您提供了处理它的正确工具。
例如:
auto_ptr<Foo> make_foo()
{
return auto_ptr<Foo>(new Foo);
}
Foo *raw_pointer=make_foo().release();
shared_ptr<Foo> shared_pointer=make_foo();
auto_ptr<Foo> auto_pointer=make_foo();
如果您返回 shared_ptr
,您将无法回退到普通指针,而使用 auto_ptr
则可以。你总是可以升级 auto_ptr
到共享但不是其他方向。
另一个重点,shared_ptr
使用原子引用计数,速度要慢得多
auto_ptr
所做的简单而高效的工作。
P.S.: scoped_ptr
只是穷人的 auto_ptr
版本 --- 它是不可复制的并且确实
没有默认构造函数。它更像是 auto_ptr
的“较少混淆”版本,与 shared_ptr
相比,它不在 tr1 中。通常使用没有太多优势
scoped_ptr
优于 auto_ptr
关于c++ - 返回需要由智能指针持有的 'pointer',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631633/