繁体   English   中英

std :: auto_ptr和boost :: shared_ptr的语义含义

[英]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在语义上是否接近Ptrshared_ptr是否与ref相同? 还是应该因为auto_ptr具有“所有权转移”语义而显式使用它?

谢谢,

std::auto_ptr具有所有权转移语义,但是它已经很残破了。 如果可以使用boost::shared_ptr ,那么应该使用boost::unique_ptr而不是std::auto_ptr ,因为它可以实现预期的效果。 它所有权转移使以前的实例无效,其中std::auto_ptr没有。

更好的是,如果可以使用C ++ 11,则交换到std::unique_ptrstd::shared_ptr

您不应该使用不推荐使用的std::auto_ptr ,而且我认为它很危险,甚至在将其隐藏在Ptr这样的通用typedef后面时,更是如此。

我认为调用shared_ptr Ref没有任何意义,在这种情况下,它的Ptrauto_ptr

编辑:我认为它很危险,因为即使您完全了解它的工作原理,也可以很容易地滥用它,但是您可能会不小心滥用它,尤其是将其隐藏在typedef后面时。 一个好的班级应该易于使用和滥用 尤其是随着unique_ptr的到来,我看不到auto_ptr任何有用方案。

auto_ptr在C ++ 11中已弃用。 您可能要停止使用它,而只使用shared_ptr 对于shared_ptr ,分配时不进行所有权转移,在销毁最后一个指针时,会计算对该对象的引用数,并销毁该对象。

我相信该命令只是某人使用的术语。
可能应该是,对于auto_ptrref ,对于shared_ptr来说是ptr ,因为:

引用是不可变的,因此不能引用其他对象。 auto_ptr具有相似(尽管在远程上相似)的语义,即所有权转移,这意味着您可能不希望为其显示的非直觉行为分配auto_ptr。 分配的对象获得所有权,而分配的对象失去所有权。

另一方面, shared_ptr具有引用计数机制,该机制类似于(再次远程)可以指向同一对象的多个指针。 指针的所有权由shared_ptr本身承担,并且在没有指针实例引用该指针后立即将其释放。

在很大程度上取决于它们的用途。 Ref的情况下,人们对此有所了解。 在标准时间之前,我经常使用typedef到Ptr作为(侵入式)引用计数指针; 实际上,这种类型定义的存在表明该类型支持引用计数,并且应该始终对其进行动态分配。

std::auto_ptrboost::shared_ptr都有非常特殊的语义。 我倾向于不为它们使用typedef,这既是由于特殊的语义,又是因为(与我的侵入性引用计数指针不同)它们完全独立于所指向的类型。 对于任何给定类型,您都可以按照程序逻辑的要求使用或不使用它们。 (由于其特定的语义,我发现std::auto_ptr有很多用途。但是我倾向于避免使用boost::shared_ptr ;这很危险。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM