目录
C++ 11提供了智能指针的两个概念:
- shared_ptr用于共享所有权
- unique_ptr用于独占所有权
后者代替了现在不推荐使用的C++ 98的auto_ptr。
性能问题
为什么C++标准库提供不止一种智能指针?答案与共享指针的性能影响有关。
shared_ptr是通过非侵入性方法实现的,这意味着该类管理的对象不必满足特定的要求,例如通用基类。最大的优点是该概念可以应用于任何类型,包括基本数据类型。代价是shared_ptr对象内部需要多个成员:指向该对象的普通指针和由引用同一对象的所有共享指针共享的参考计数器。因为弱指针可能指向共享对象,所以甚至还需要另一个计数器。 (即使没有更多的共享指针使用一个对象,也需要计数器,直到所有弱指针都指向该对象为止;否则,不能保证它们返回的use_count()为0。)
因此,共享指针和弱指针在内部需要附加辅助对象,这意味着不可能进行一些特定的优化(包括空的基类优化,这将消除任何内存开销)。
唯一指针unique_ptr不需要任何这些开销。它的“智慧”是基于特殊的构造函数和特殊的析构函数,以及消除了复制语义。使用无状态或空变量时,唯一指针unique_ptr应消耗与本机指针相同的内存量,与使用本机指针和手动执行删除操作相比,不应有运行时开销。
为避免引入不必要的开销,应该对删除器使用函数对象(包括lambda),以实现最佳优化,理想情况下零开销。
使用问题
智能指针并不完美——仍然必须知道它们解决了哪些问题以及存在哪些问题。例如,对于任何智能指针类,切勿为同一普通指针创建多个智能指针。
shared_ptr和unique_ptr提供了处理数组和删除器的不同方法。unique_ptr对数组进行偏特化处理,从而提供了不同的接口。它更灵活并且性能开销较少,但使用它可能需要更多的编码工作。
最后,请注意一般来说,智能指针不是线程安全的。