在我们的大项目中,我们有很多课程,其中包含以下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
应该明确使用,因为它具有“所有权转移”语义?
谢谢,
答案 0 :(得分:2)
std::auto_ptr
具有所有权转移语义,但它已经完全崩溃了。如果您可以使用boost::shared_ptr
,那么您应该使用boost::unique_ptr
而不是std::auto_ptr
,因为它可以达到预期效果。它转移所有权和使前一个实例无效,std::auto_ptr
没有。
更好的是,如果您可以使用C ++ 11,那么请换到std::unique_ptr
和std::shared_ptr
。
答案 1 :(得分:1)
你不应该使用std::auto_ptr
,不推荐使用它,我认为它很危险,当你将它隐藏在Ptr
这样的通用typedef后面时更是如此。
我认为调用shared_ptr
Ref没有任何意义,在这种情况下它比Ptr
更多{。}}。
auto_ptr
的出现,我无法看到unique_ptr
的任何有用场景。
答案 2 :(得分:0)
auto_ptr
。您可能想要停止使用它,只需使用shared_ptr
即可。对于shared_ptr
,在赋值时没有所有权转移,对对象的引用数进行计数,并在最后一个指针被销毁时销毁对象。
答案 3 :(得分:0)
我认为订单只是某人使用的命名法
可能应该ref
auto_ptr
和ptr
shared_ptr
,因为:
引用是不可变的,因此不能引用其他对象。 auto_ptr
具有类似(尽管远程类似)的语义,所有权转移意味着您可能不希望为其显示的非直观行为分配auto_ptr。分配的对象获得所有权,而被分配的对象失去所有权。
另一方面,shared_ptr
有一个引用计数机制,它与多个指针类似(再次远程),可以指向同一个对象。指针的所有权取决于shared_ptr
本身,只要没有引用它的指针实例就会解除分配。
答案 4 :(得分:0)
很大程度上取决于它们的用途。而在这种情况下
Ref
,人们对它的理解。在标准前的日子里,我愿意
经常使用typedef到Ptr
来计算我的(侵入性)引用
指针;事实上,这种类型的存在是一种迹象
类型支持引用计数,它应该始终是
动态分配。
std::auto_ptr
和boost::shared_ptr
都非常特别
语义。我倾向于不使用typedef,因为它们
特殊的语义,因为(与我的入侵参考的情况不同
计数指针)它们完全独立于指向的类型。
对于任何给定的类型,您可以使用它们,也可以不使用它们作为程序逻辑
需要。 (由于其特殊的语义,我发现了相当多的
用于std::auto_ptr
。但是,我倾向于避免使用boost::shared_ptr
;
这很危险。)