我有一个项目,我想更多地使用智能指针.总的来说,我在这个目标上取得了成功.但是,我遇到过一些我不确定"最佳实践"是什么的事情.
基本上我想从函数返回一个"指针",但要求用户将它保存在智能指针中.不仅如此,我不想强制使用特定的智能指针(共享与范围).
问题主要在于似乎没有适当的方法将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
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |