我有一个项目,我想更多地使用智能指针。总的来说,我在这个目标上取得了成功。然而,我遇到了一些我不确定“最佳实践”是什么的事情。
基本上我想从函数返回一个“指针”,但是require用户将其放在智能指针中。不仅如此,我不想强制使用特定的智能指针(共享与作用域)。
问题主要是似乎没有正确的方法来升级scoped_ptr
to a shared_ptr
(我认为这将是理想的解决方案)。我理解他们为什么不这样做,因为这将允许所有权转让,这可能会导致诸如此类的问题std::auto_ptr
has.
然而,转让所有权似乎是一个好主意this案件。所以我的想法是这样的:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
这工作“正常”,因为两者scoped_ptr
and shared_ptr
有从 a 获取所有权的构造函数std::auto_ptr
.
所以我的问题是,这是好的做法吗?有更好的解决方案吗?我能想到的唯一真正的替代方案是使用模板 template 作为返回值,如下所示:
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
这实际上可以很好地工作,只是我认为需要一些工作才能使其与scoped_ptr
too.
想法?
Using std::auto_ptr
is the事实上,好的做法这样的例子 http://www.research.att.com/~bs/bs_faq2.html#memory-leaks被建议
作者:比亚恩·斯特鲁斯特鲁普。
的移动语义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
does.
P.S.: scoped_ptr
只是版本auto_ptr
对于穷人来说——它是不可复制的并且确实
没有默认构造函数。它更像是“不太混乱”的版本auto_ptr
,相比之下shared_ptr
它不在 tr1 中。一般来说,使用没有太大的优势scoped_ptr
over auto_ptr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)