4.5.3 静态对象
如果在程序库的实现中定义了任何静态对象,那么实现者就需要小心处理这些对象所使用的空闲存储空间。考虑4.5.1小节讨论的preprocess函数,假设由于某种原因;preprocess函数使用了一个静态变量,用来保存输入文本的当前行:
- bool preprocess(istream& i, const List<string>& incldirs,
- ostream& o) {
- static String curline;
- while(more text in i) {
- curline = nex line of text in i;
- //...
- }
- //...
- return true;
- }
如上面的伪代码所示,preprocess每次都读取一行文本,并把它赋给curline变量。而且,由于String类的实现,这行文本会被储存在空闲存储空间里面。于是,当preprocess函数返回的时候,问题就出现了;curline这时还存储着文本的最后一行;也就是说,用于存储curline的空闲存储空间将会被白白浪费,直到下次调用preprocess函数或者这个程序执行结束。另外,对于输入行的长度并没有给予一定的限制,从而对preprocess函数浪费的空闲存储空间的大小也就没有限制了。
为了解决这个问题,可以在从程序库函数返回之前,释放静态对象使用的空闲存储空间;
- bool preprocess(istream& i, const List<String>& incldirs,
- ostream& o) {
- //...
- curline = "" //释放curline使用的空间。
- return true;
- }
把空字符串赋值给curline变量几乎释放了curline使用的所有空闲存储空间,只有遗留微不足道的存储空间没有释放。很自然地,通过上面这种方法,对象所使用空间的释放方式取决于对象的类型。