我有一个项目,我想更多地使用智能指针.总的来说,我在这个目标上取得了成功.但是,我遇到过一些我不确定"最佳实践"是什么的事情.
基本上我想从函数返回一个"指针",但要求用户将它保存在智能指针中.不仅如此,我不想强制使用特定的智能指针(共享与范围).
问题主要在于似乎没有适当的方法将a升级scoped_ptr
为a shared_ptr
(这是我认为的理想解决方案).我明白为什么他们不这样做,因为它会允许转让所有权,这可能导致一些像这样的问题std::auto_ptr
.
但是,对于这种情况,转让所有权似乎是一个好主意.所以我的想法是这样的:
// contrived example of factory pattern std::auto_ptr func() { return std::auto_ptr(new A); }
因为两者都有"好",scoped_ptr
并且shared_ptr
拥有从a获得所有权的构造函数std::auto_ptr
.
所以我的问题是,这是一个好习惯吗?有更好的解决方案吗?我能够想出的唯一真正的替代方法是使用模板模板作为返回值,如下所示:
// similar to above example template class P> P func() { return P(new A); }
实际上可以很好地工作,除了我认为它需要一些工作来使它与它一起工作scoped_ptr
.
思考?
使用std::auto_ptr
是一种很好的做法,实际上Bjarne Stroustrup提出了这样的例子.
移动语义auto_ptr
为您提供了正确的工具来处理它.
例如:
auto_ptrmake_foo() { return auto_ptr (new Foo); } Foo *raw_pointer=make_foo().release(); shared_ptr shared_pointer=make_foo(); auto_ptr auto_pointer=make_foo();
如果你返回shared_ptr
你不能回退到正常指针,auto_ptr
你可以.你可以总是升级auto_ptr
到共享但不是其他方向.
另一个重点是,shared_ptr
使用原子引用计数,这比简单而又完全高效的工作慢得多auto_ptr
.
PS:scoped_ptr
只是auto_ptr
poors的版本---它是不可复制的,没有默认的构造函数.它更像是"不那么令人困惑"的版本auto_ptr
,shared_ptr
而不是在tr1中.一般来说,使用scoped_ptr
结束没有多大优势
auto_ptr