返回一个需要由智能指针保持的"指针"

Eva*_*ran 9 c++ boost tr1

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

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

问题主要在于似乎没有适当的方法将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); }
Run Code Online (Sandbox Code Playgroud)

因为两者都有"好",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); }
Run Code Online (Sandbox Code Playgroud)

实际上可以很好地工作,除了我认为它需要一些工作来使它与它一起工作scoped_ptr.

思考?

Art*_*yom 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();
Run Code Online (Sandbox Code Playgroud)

如果你返回shared_ptr你不能回退到正常指针,auto_ptr你可以.你可以总是升级auto_ptr到共享但不是其他方向.

另一个重点是,shared_ptr使用原子引用计数,这比简单而又完全高效的工作慢得多auto_ptr.

PS:scoped_ptr只是auto_ptrpoors的版本---它是不可复制的,没有默认的构造函数.它更像是"不那么令人困惑"的版本auto_ptr,shared_ptr而不是在tr1中.一般来说,使用scoped_ptr结束没有多大优势 auto_ptr

  • 使用scoped_ptr而不是auto_ptr的好处是,当你想要清楚地表明你不应该复制指针时.你根本不能用scoped_ptr.这是关于传达你的意图,就像你的例子与auto_ptr和所有权转移一样. (2认同)