August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当不能只在单一的作用域(及其子作用域)内使用vector对象时,我们应该怎么做呢?例如:
这一例子具有普遍意义:我们调用一个函数构造一个复杂的数据结构,并将该结构作为结果返回。问题是,如果在“填充”vector对象时发生了异常,那么make_vec()将会造成vector对象所占内存空间的泄漏。一个不相关的问题是,如果该函数成功了,那么我们不得不通过delete销毁由make_vec()返回的对象(参见12.4.6节)。
我们可以通过try语句块处理异常的抛出:
make_vec()函数展示了错误处理的一个十分通用的形式:函数总是试图完成它的工作,而如果它不能完成工作,则它应释放所有的局部资源(在这里是自由存储区中分配的vector对象)并通过抛出异常的方式报告其工作的失败。在这里,异常是由一些其他的函数产生并抛出的(如vector::at());make_vec()只是通过throw直接将该异常重新抛出;这是一种简单而有效地处理错误的方法,并且能够被系统地使用:
·基本保证:代码try…catch的目的是保证make_vec()要么成功,要么在不造成资源泄漏的前提下抛出异常。这通常称为基本保证。如果程序中的某段代码需要能够从异常throw中恢复,那么该段代码就需要提供基本保证。所有的标准库代码均提供了基本保证。 ...