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

时间:2012-01-31 08:23:10

标签: c++ shared-ptr auto-ptr aliases

在我们的大项目中,我们有很多课程,其中包含以下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应该明确使用,因为它具有“所有权转移”语义?

谢谢,

5 个答案:

答案 0 :(得分:2)

std::auto_ptr具有所有权转移语义,但它已经完全崩溃了。如果您可以使用boost::shared_ptr,那么您应该使用boost::unique_ptr而不是std::auto_ptr,因为它可以达到预期效果。它转移所有权使前一个实例无效,std::auto_ptr没有。

更好的是,如果您可以使用C ++ 11,那么请换到std::unique_ptrstd::shared_ptr

答案 1 :(得分:1)

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

我认为调用shared_ptr Ref没有任何意义,在这种情况下它比Ptr更多{。}}。

编辑:我认为它很危险,因为你很容易滥用它,即使你完全理解它的工作原理,你也可能会意外地误用它,特别是当它隐藏在typedef后面时。好的课程应该易于使用,应该难以滥用。特别是随着auto_ptr的出现,我无法看到unique_ptr的任何有用场景。

答案 2 :(得分:0)

在C ++ 11中不推荐使用

auto_ptr。您可能想要停止使用它,只需使用shared_ptr即可。对于shared_ptr,在赋值时没有所有权转移,对对象的引用数进行计数,并在最后一个指针被销毁时销毁对象。

答案 3 :(得分:0)

我认为订单只是某人使用的命名法 可能应该ref auto_ptrptr shared_ptr,因为:

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

另一方面,shared_ptr有一个引用计数机制,它与多个指针类似(再次远程),可以指向同一个对象。指针的所有权取决于shared_ptr本身,只要没有引用它的指针实例就会解除分配。

答案 4 :(得分:0)

很大程度上取决于它们的用途。而在这种情况下 Ref,人们对它的理解。在标准前的日子里,我愿意 经常使用typedef到Ptr来计算我的(侵入性)引用 指针;事实上,这种类型的存在是一种迹象 类型支持引用计数,它应该始终是 动态分配。

std::auto_ptrboost::shared_ptr都非常特别 语义。我倾向于不使用typedef,因为它们 特殊的语义,因为(与我的入侵参考的情况不同 计数指针)它们完全独立于指向的类型。 对于任何给定的类型,您可以使用它们,也可以不使用它们作为程序逻辑 需要。 (由于其特殊的语义,我发现了相当多的 用于std::auto_ptr。但是,我倾向于避免使用boost::shared_ptr; 这很危险。)