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