促进 C++库

……其中一个世界。 赫伯·萨特安德烈亚历山德雷斯库,C++编码标准

这是旧版本Boost的文档。单击此处查看此页面的最新版本。

智能指针

介绍
通用要求
例外安全
例外情况说明
历史和致谢
工具书类

介绍

智能指针是存储指向动态分配(堆)的指针的对象物体。它们的行为与内置C++指针很相似,只是它们在适当的时间自动删除指向的对象。聪明指针在面对异常时特别有用,因为它们可以确保正确销毁动态分配的对象。它们还可以用于跟踪多个所有者共享的动态分配对象。

从概念上讲,智能指针被视为拥有指向的对象,因此负责删除不再需要的对象。

智能指针库提供了六个智能指针类模板:

作用域_ptr <boost/scoped_ptr.hpp> 单一对象的简单所有权。不可复制。
作用域数组 <boost/scoped_array.hpp> 阵列的简单所有权。不可复制。
共享ptr <boost/shared_ptr.hpp> 多个指针之间共享的对象所有权。
共享数组 <boost/shared_array.hpp> 多个指针之间共享的数组所有权。
弱_ptr <boost/weak_ptr.hpp> 所属对象的非所有者观察员共享ptr.
侵入_ptr <boost/intrusive_ptr.hpp> 具有嵌入引用计数的对象的共享所有权。

这些模板旨在补充标准::auto_ptr模板。

它们是“资源获取就是初始化”习语的示例在Bjarne Stroustrup的《C++编程语言》第三版中进行了描述,第14.4节,资源管理。

此外,智能指针库还提供高效的工厂函数用于创建智能指针对象:

make_shared、allocate_shared对于对象 <boost/make_shared.hpp> 高效创建共享ptr物体。
make_shared、allocate_shared用于阵列 <boost/make_shared.hpp> 高效创建共享ptr数组。
使唯一 <boost/make_unique.hpp> 创建唯一_ptr对象和数组。

测试程序,智能测试.cpp,是用于验证正确操作。

上的一页兼容性使用旧版本的Boost智能指针库描述了自早期以来的一些更改智能指针实现的版本。

上的一页智能指针计时将引起兴趣给那些对性能问题好奇的人。

上的一页智能指针编程技术列表的一些高级应用共享ptr弱_ptr.

通用要求

这些智能指针类模板具有模板参数,T型,其中指定智能指针指向的对象的类型。行为如果析构函数或操作员删除对于类型为的对象T型抛出异常。

T型在智能指针声明处可能是不完整的类型。除非另有规定,否则要求T型是一个完整的类型智能指针实例化的点。诊断需要实施(视为错误)所有违反此要求的行为,包括删除不完整的类型。请参阅的描述 选中_删除函数模板。

请注意共享ptr没有此限制,因为大多数其成员函数不需要T型成为一个完整的类型。

理论基础

以下方面的要求T型精心设计,最大限度地提高安全性handle-body(也称为pimpl)和类似的习惯用法。在这些习语中指针可能出现在翻译单元中,其中T型是不完整的类型。这将接口与实现分离,并将实现从仅使用界面的翻译单元。中描述的示例特定智能指针的文档说明了中智能指针的使用这些习语。

请注意作用域ptr要求T型是一个完整的类型破坏时间,但共享ptr没有。

例外安全

这些智能指针类中的几个函数被指定为“noeffect”或“not effect except such and such”,如果抛出异常表示当这些类之一的对象引发异常时,整个程序状态与函数调用之前的状态保持不变这导致引发异常。这相当于保证没有可检测的副作用。其他函数从不抛出异常。函数抛出的唯一异常(假设T型满足这个共同要求)是标准::bad_alloc,并且只由明确记录为可能会扔标准::bad_alloc.

例外情况说明

未使用特殊情况;看见例外规范理由.

所有智能指针模板都包含永远不会抛出的成员函数异常,因为它们既不会自己引发异常,也不会调用其他异常可能引发异常的函数。这些成员由注释表示://从不扔.

禁止使用破坏指向类型对象的函数抛出异常共同要求.

历史和致谢

2017年2月。格伦·费尔南德斯改写分配_共享make_shared(品牌_共享)以获得更优化和更多可维护的实现。

2014年2月。格伦·费尔南德斯更新了的过载make_shared(品牌_共享)分配_共享符合C++标准纸的规范[D&F-14],并已实施使唯一数组和对象。彼得·迪莫夫和格伦·费尔南德斯更新了标量和数组实现分别用于解决C++标准库缺陷2070

2012年11月。Glen Fernandes提供了生成共享(_S)分配_共享用于数组。它们实现了对可以用构造函数参数或初始值设定项列表初始化的数组以及默认初始化和无值初始化的重载。请参阅make_shared和allocate_shared用于阵列第页了解更多信息。

2002年1月。彼得·迪莫夫重新设计了所有四个类,增加了功能,修复了bug,并将其拆分为四个单独的标题,并添加了弱_ptr.请参阅兼容性页面中的摘要变化。

2001年5月。弗拉基米尔·普鲁斯建议要求进行一次完整的销毁。在包括戴夫·阿布拉哈姆斯、格雷格·科尔文、贝曼在内的讨论中不断完善Dawes、Rainer Deyke、Peter Dimov、John Maddock、Vladimir Prus、Shankar Sai和其他。

1999年11月。Darin Adler提供操作员==,操作员=、和标准::交换标准::less共享类型的专门化。

1999年9月。Luis Coelho提供shared_ptr::swapshared_array::swap

1999年5月。1999年4月和5月,瓦伦丁·博纳尔(Valentin Bonnard)和大卫·亚伯拉罕(David Abrahams)许多建议导致了许多改进。

1998年10月。Beman Dawes建议在姓名安全_ptr计数_ptr,Per Andersson,Matt的会议奥斯汀、格雷格·科尔文、肖恩·科菲尔德、皮特·贝克尔、尼科·约瑟蒂斯、迪特马尔·库尔,内森·迈尔斯(Nathan Myers)、池江湾(Chiciang Wan)和朱迪·沃德(Judy Ward)。在讨论中类名已经确定,决定不需要确切地遵循标准::auto_ptr接口,以及各种功能签名和语义已经确定。

在接下来的三个月里,考虑了以下几项实施共享ptr,并在boost.org网站邮件列表。实施问题围绕着参考计数,必须保留,或者附加到指向的对象,或者在其他位置分离。每个这些变体本身有两个主要变体:

每种实现技术都有优点和缺点。我们走了这么远运行直接和间接方法的各种计时,发现至少在英特尔奔腾芯片上,几乎没有什么可测量的差异。凯夫林·亨尼(Kevlin Henney)提供了一篇他写的关于“身体计数技术”(Counted Body Techniques)的论文Kühl建议使用一种优雅的部分模板专门化技术,以允许用户可以选择他们喜欢的实现进行了试验。

但Greg Colvin和Jerry Schwarz认为,“参数化会阻碍用户”,最终我们选择只提供直接实现。

1994年夏。Greg Colvin向C++标准委员会推荐了名为自动打印计数_ptr与我们现在所说的非常相似作用域ptr共享ptr.[第94列]在极少数几个未遵循图书馆工作组建议的案例全体委员会,计数_ptr被拒绝,令人惊讶所有权转让语义被添加到自动打印.

工具书类

[D&F-14飞机]彼得·迪莫夫和格伦·费尔南德斯,将make_shared扩展到支持阵列,修订版1,C++委员会文件N3870,2014年1月。

[第94列]格雷戈里·科尔文,例外安全智能指针,C++委员会文件94-168/N0555,1994年7月。

[E&D-94公司]John R.Ellis和David L.Detlefs,C的安全、高效垃圾收集++,Usenix诉讼,1994年2月。本文包括对弱指针的广泛讨论以及大量的参考书目。


$日期$

版权所有1999 Greg Colvin和Beman Dawes。版权所有2002 Darin Adler。根据Boost软件许可证1.0版进行分发。见附件文件许可证_1_0.txt或复制于http://www.boost.org/LICENSE_1_txt.