4.5.2 尽可能快地释放空闲资源
C++(www.cppentry.com)程序库通常都应该尽可能快地释放它们占用的资源。考虑上面的compile_preprocesed函数,当代码编译的时候,在每个作用域都会有符号表的入口,而每个作用域的符号表都包含着这个作用域内已声明名字的信息。很显然,符号表占用的空间应该分配在空闲存储区域,那么,程序库最早什么时候可以删除每个符号表呢?这个答案取决于作用域的类型。函数作用域的符号表可以在函数代码编译完之后立刻被删除,因为位于函数定义后面的程序文本的含义并不依赖于函数内部声明的名字。如下所示:
- void f() {
- int i;
- //...
- }
- //这里的代码的含义不受i和f是否存在的影响。
另一方面,类作用域的符号表只有在compile_preprocessed函数编译完所有要编译的代码之后,才能被删除: - class T {
- public;
- void f();
- };
- int main() {
- T t;
- t.f; //使用了类T作用域内声明的函数名字f。
- }
要想准确决定资源最快可以被释放的安全时机是很困难的。对于释放资源,通常的解决方式是使用垃圾收集器;但ANSI/ISO C++(www.cppentry.com)并没有要求C++(www.cppentry.com)编译器提供一个垃圾收集器(虽然某些C++(www.cppentry.com)编译器确实提供了垃圾收集器,但并不是所有的C++(www.cppentry.com)编译器都提供;因此,依赖于垃圾收集器的存在将会限制代码的移植性)。