August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
所有重要的程序都包含一项关键任务:管理资源。所谓资源是指程序中符合先申请后释放(显式地或者隐式地)规律的东西,比如内存、锁、套接字、线程句柄和文件句柄等。对于长时间连续运行的程序来说,如果不能及时地释放掉资源(即造成了“泄漏”),就有可能大大降低程序的运行效率甚至造成程序崩溃。即使在短时间运行的程序中,资源泄漏也可能造成严重的后果,比如说由于系统资源短缺导致运行时间增长几个数量级。
标准库组件不会出现资源泄漏的问题,因为它们的设计依赖于支持资源管理的基本语言特性,使用成对的构造函数/析构函数来确保资源不会比其所属对象的生命周期更长。举一个例子,4.2.2节介绍的Vector就是使用构造函数/析构函数对的机制管理元素的,而且所有的标准库容器的实现方式也都与之类似。更重要的,这种方法能与使用异常的错误处理机制正确交互。例如,标准库中的锁类就使用了这种技术:
lck的构造函数首先申请它的mutex,然后thread才开始处理(参见15.5节)。对应的析构函数负责释放掉资源。因此,在本例中,当控制线程离开f()时(通过return语句,或“直到函数末尾”,或抛出异常),scoped_lock的析构函数负责释放掉mutex。
这是“资源请求即初始化”技术(RAII,见4.2.2节)的一个典型应用。RAII是C++中常用的资源处理方法的基础。容器(如vector和map、string和iostream)管理资源(如文件句柄和缓冲区)的方式都十分相似。
Read now
Unlock full access