c++ - 返回需要由智能指针持有的 'pointer'

标签 c++ boost tr1

我有一个项目,我想更多地使用智能指针。总的来说,我已经成功地实现了这个目标。但是,我遇到了一件事,我不确定“最佳做法”是什么。

基本上我想从函数返回一个“指针”,但要求用户将它保存在一个智能指针中。不仅如此,我不想强​​制使用特定的智能指针(共享与作用域)。

问题主要在于似乎没有将 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_ptrshared_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/

相关文章:

c++ - 如何查询boost::filesystem::path的长度?

c++ - 你如何获得 shared_ptr 弱计数?

c++ - 使用 unordered_map 从两个大文本文件中删除重复项

c++ - tr1::reference_wrapper 有什么用?

c++ - 如何在可变大小的类中创建指针数组?

c++ - 为什么使用基于 boost 的库时生成的预编译文件如此大?

c++ - 基准三角查找表性能提升与 cpp 实现

c++ - 来自 boost::iostreams::copy() 的异常

c++ - 在哪里可以找到有关 D_GLIBCXX_DEBUG 和 DNDEBUG 标志的更多信息?

c++ - 将字符串声明为 std :string in C++