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

Semantic meanings of std::auto_ptr and boost::shared_ptr

本文关键字:ptr 语义 shared boost std auto      更新时间:2023-10-16

在我们的大型项目中,我们有很多具有以下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_ptrRef没有任何意义,在这种情况下,它更像是Ptr而不是auto_ptr

编辑:我认为它很危险,因为你很容易滥用它,即使你完全了解它的工作原理,你也可能意外地滥用它,尤其是当你把它藏在typedef后面时。一个好的类应该很容易使用,应该很难误用。特别是随着unique_ptr的出现,我看不出auto_ptr有任何有用的场景。

我相信这个顺序只是有人使用的一个命名法
可能应该是,ref代表auto_ptrptr代表shared_ptr,因为:

引用是不可变的,因此不能用来引用其他对象。auto_ptr具有类似(尽管有点相似)的语义,即所有权转移,这意味着您可能不想为它显示的非直观行为分配auto_ptr。指定的对象获得所有权,而被指定的对象失去所有权。

另一方面,shared_ptr具有类似于(再次远程地)可以指向同一对象的多个指针的引用计数机制。指针的所有权属于shared_ptr本身,一旦没有指针实例引用它,它就会被释放。

很大程度上取决于它们的用途。在Ref,人们对它的理解。在标准之前的日子里,我会对于我的(侵入性)参考计数,经常使用Ptr的typedef指针;事实上,这样一个typedef的出现表明类型支持引用计数,并且应该始终动态分配。

CCD_ 29和CCD_语义。我倾向于不为它们使用typedef,因为特殊的语义,并且因为(与我的侵入性引用不同计数指针),它们完全独立于所指向的类型。对于任何给定的类型,您都可以使用或不使用它们作为程序逻辑需要。(由于其特殊的语义,我发现用于CCD_ 31。然而,我倾向于避开boost::shared_ptr;这相当危险。)

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