【发布时间】:2012-01-13 04:40:52
【问题描述】:
我听说自动指针拥有它们的对象,而共享指针可以有许多指向它们的对象。为什么我们不一直使用共享指针。
关于什么是智能指针,人们将这个术语与共享指针互换使用。它们是一样的吗?
【问题讨论】:
标签: c++ shared-ptr smart-pointers auto-ptr
我听说自动指针拥有它们的对象,而共享指针可以有许多指向它们的对象。为什么我们不一直使用共享指针。
关于什么是智能指针,人们将这个术语与共享指针互换使用。它们是一样的吗?
【问题讨论】:
标签: c++ shared-ptr smart-pointers auto-ptr
std::auto_ptr 是一个过时的、已弃用的独占指针所有权实现。在 C++11 中,它已被 std::unique_ptr 取代。独占所有权意味着指针为某物所拥有,并且对象的生命周期与所有者的生命周期相关。
共享指针 (std::shared_ptr) 实现共享指针所有权——只要有对它的活动引用,它们就会使对象保持活动状态,因为没有单一的所有者。它通常通过引用计数来完成,这意味着与唯一指针相比,它们具有额外的运行时开销。此外,对共享所有权的推理比对独占所有权的推理更困难——破坏点变得不那么确定了。
智能指针是一个术语,它包含所有行为类似于指针的类型,但添加了(智能)语义,而不是原始T*。 unique_ptr 和 shared_ptr 都是智能指针。
【讨论】:
共享指针的成本稍高一些,因为它们拥有引用计数。 在某些情况下,如果您有一个在多个递归级别具有共享指针的复杂结构,则一次更改可能会触及其中许多指针的引用计数。
同样在多 CPU 内核架构中,如果多个内核当前正在访问同一内存区域,则引用计数的原子更新至少可能不会变得稍微昂贵,但实际上确实非常昂贵。
然而,共享指针使用起来既简单又安全,而自动指针的赋值属性令人困惑,并且可能变得非常危险。
智能指针通常只是作为共享指针的同义词使用,但实际上涵盖了 boost 中所有的各种指针实现,包括类似于共享指针的那个。
【讨论】:
可以有多种形式的智能指针。现在在 C++11 中的受 Boost 启发的 shared_ptr 就是其中之一。我建议在有疑问时几乎在所有地方都使用 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
【讨论】: