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
在语义上是否接近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
有任何有用的场景。
我相信这个顺序只是有人使用的一个命名法
可能应该是,ref
代表auto_ptr
,ptr
代表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
,分配时不存在所有权转移,计算对对象的引用数,并在销毁最后一个指针时销毁对象。
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- CLANG 编译器 说:变量"PTR"可能未初始化
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 在C++17中,引用const字符串的语义应该是什么
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- Xcode 语义问题引用或以前定义的代码
- 为共享 ptr 向量实现复制 c'tor?
- 使用移动和复制语义时函数匹配如何工作?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 独特的PTR和移动语义