9

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

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

问题主要在于似乎没有正确的方法将 a 升级scoped_ptr到 a 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从 a 获取所有权的构造函数std::auto_ptr

所以我的问题是,这是好的做法吗?有更好的解决方案吗?我能想到的唯一真正的选择是使用模板模板作为返回值,如下所示:

// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }

这实际上可以很好地工作,只是我认为它需要一些工作才能让它与 a 一起工作scoped_ptr

想法?

4

3 回答 3

11

使用std::auto_ptr一种很好的做法,实际上这样的例子是由 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

PS:scoped_ptr只是auto_ptrfor Poors 的版本 --- 它是不可复制的并且没有默认构造函数。它更像是“不那么混乱”的版本auto_ptr,相比之下shared_ptr它不在 tr1. scoped_ptr一般来说,使用over没有太大的优势 auto_ptr

于 2009-03-10T18:56:07.820 回答
3

如果您建立一个工厂,您只需返回一个指针即可。您工厂的用户可以自行决定如何以及在何处放置此指针。
如果您需要强制使用智能指针,则必须限制选择,因为您不希望他们使用“错误”的指针。
所以 boost::shared_ptr。但最好将其 typedef 到 MyClassPtr 或 MyClass::ptr。
尽管如此,它们就像“新”的工厂。当我想要时,我将 new 的结果放入 std::auto_ptr 中。但是当我不想要智能指针时,我不想一直被迫调用“释放”。

于 2009-03-10T18:26:17.063 回答
1

使用 C++11,您应该能够使用std::unique_ptr其他智能指针类型具有采用std::unique_ptr. 如果您维护此类资源的内部列表,那么您可能希望使用std::shared_ptr.

于 2011-10-18T02:20:25.487 回答