我听说自动指针拥有自己的对象,而共享指针可以有许多指向它们的对象。为什么我们不一直使用共享指针。
与此相关的智能指针,人们可以将这个术语与共享指针互换使用。它们是一样的吗?
答案 0 :(得分:18)
std::auto_ptr
是一个过时的,已弃用的独占指针所有权实现。它已被C ++ 11中的std::unique_ptr
取代。独占所有权意味着指针由某些东西拥有,并且该对象的生命周期与所有者的生命周期相关联。
共享指针(std::shared_ptr
)实现共享指针所有权 - 只要存在对它的活动引用,它们就会使对象保持活动状态,因为没有单个所有者。它通常使用引用计数完成,这意味着它们具有额外的运行时开销而不是唯一指针。关于共享所有权的推理也比独立所有权的推理更困难 - 破坏点变得不那么确定了。
智能指针是一个术语,它包含所有类似行为的类型,但添加(智能)语义,而不是原始T*
。 unique_ptr
和shared_ptr
都是智能指针。
答案 1 :(得分:2)
共享指针的成本略高,因为它们包含引用计数。 在某些情况下,如果您在多个递归级别具有共享指针的复杂结构,则一个更改可以触及许多指针的引用计数。
同样在多CPU核心架构中,引用计数的原子更新至少可能不会有轻微的成本,但实际上如果多核当前正在访问相同的内存区域,则实际上非常昂贵。
然而,共享指针使用简单且安全,而自动指针的赋值属性令人困惑,并且可能变得非常危险。
智能指针通常经常被用作共享指针的同义词,但实际上涵盖了boost中的所有各种指针实现,包括与共享指针类似的指针。
答案 2 :(得分:1)
可以有多种形式的智能指针。提升灵感的shared_ptr现在在C ++ 11中就是其中之一。我建议在有疑问的时候在几乎所有的地方使用shared_ptr而不是有很多怪癖的auto_ptr。
简而言之,shared_ptr只是一个共享同一对象的引用计数实现。
参见: http://www.gotw.ca/publications/using_auto_ptr_effectively.htm http://en.cppreference.com/w/cpp/memory/shared_ptr