![](/img/trans.png)
[英]std::auto_ptr or boost::shared_ptr for pImpl idiom?
[英]Semantic meanings of std::auto_ptr and boost::shared_ptr
在我们的大型项目中,我们有很多带有以下typedef
的类:
class Foo
{
public:
typedef std::auto_ptr<Foo> Ptr;
typedef boost::shared_ptr<Foo> Ref;
...
};
...
Foo::Ref foo(new Foo);
...
doBar(foo);
...
使用它们非常方便。 但是我怀疑auto_ptr
在语义上是否接近Ptr
, shared_ptr
是否与ref相同? 还是应该因为auto_ptr
具有“所有权转移”语义而显式使用它?
谢谢,
std::auto_ptr
具有所有权转移语义,但是它已经很残破了。 如果可以使用boost::shared_ptr
,那么应该使用boost::unique_ptr
而不是std::auto_ptr
,因为它可以实现预期的效果。 它所有权转移,使以前的实例无效,其中std::auto_ptr
没有。
更好的是,如果可以使用C ++ 11,则交换到std::unique_ptr
和std::shared_ptr
。
您不应该使用不推荐使用的std::auto_ptr
,而且我认为它很危险,甚至在将其隐藏在Ptr
这样的通用typedef后面时,更是如此。
我认为调用shared_ptr
Ref没有任何意义,在这种情况下,它的Ptr
比auto_ptr
。
编辑:我认为它很危险,因为即使您完全了解它的工作原理,也可以很容易地滥用它,但是您可能会不小心滥用它,尤其是将其隐藏在typedef后面时。 一个好的班级应该易于使用和滥用 。 尤其是随着unique_ptr
的到来,我看不到auto_ptr
任何有用方案。
auto_ptr
在C ++ 11中已弃用。 您可能要停止使用它,而只使用shared_ptr
。 对于shared_ptr
,分配时不进行所有权转移,在销毁最后一个指针时,会计算对该对象的引用数,并销毁该对象。
我相信该命令只是某人使用的术语。
可能应该是,对于auto_ptr
是ref
,对于shared_ptr
来说是ptr
,因为:
引用是不可变的,因此不能引用其他对象。 auto_ptr
具有相似(尽管在远程上相似)的语义,即所有权转移,这意味着您可能不希望为其显示的非直觉行为分配auto_ptr。 分配的对象获得所有权,而分配的对象失去所有权。
另一方面, shared_ptr
具有引用计数机制,该机制类似于(再次远程)可以指向同一对象的多个指针。 指针的所有权由shared_ptr
本身承担,并且在没有指针实例引用该指针后立即将其释放。
在很大程度上取决于它们的用途。 在Ref
的情况下,人们对此有所了解。 在标准时间之前,我经常使用typedef到Ptr
作为(侵入式)引用计数指针; 实际上,这种类型定义的存在表明该类型支持引用计数,并且应该始终对其进行动态分配。
std::auto_ptr
和boost::shared_ptr
都有非常特殊的语义。 我倾向于不为它们使用typedef,这既是由于特殊的语义,又是因为(与我的侵入性引用计数指针不同)它们完全独立于所指向的类型。 对于任何给定类型,您都可以按照程序逻辑的要求使用或不使用它们。 (由于其特定的语义,我发现std::auto_ptr
有很多用途。但是我倾向于避免使用boost::shared_ptr
;这很危险。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.