4.5.3 静态对象

2013-10-07 15:04:03 · 作者: · 浏览: 64

4.5.3  静态对象

如果在程序库的实现中定义了任何静态对象,那么实现者就需要小心处理这些对象所使用的空闲存储空间。考虑4.5.1小节讨论的preprocess函数,假设由于某种原因;preprocess函数使用了一个静态变量,用来保存输入文本的当前行:

  1. bool preprocess(istream& i, const List<string>& incldirs,  
  2.              ostream& o) {  
  3.         static String curline;  
  4.         while(more text in i) {  
  5.              curline = nex line of text in i;  
  6.              //...  
  7.        }  
  8.        //...  
  9.        return true;  
  10.    }  

如上面的伪代码所示,preprocess每次都读取一行文本,并把它赋给curline变量。而且,由于String类的实现,这行文本会被储存在空闲存储空间里面。于是,当preprocess函数返回的时候,问题就出现了;curline这时还存储着文本的最后一行;也就是说,用于存储curline的空闲存储空间将会被白白浪费,直到下次调用preprocess函数或者这个程序执行结束。另外,对于输入行的长度并没有给予一定的限制,从而对preprocess函数浪费的空闲存储空间的大小也就没有限制了。

为了解决这个问题,可以在从程序库函数返回之前,释放静态对象使用的空闲存储空间;

  1. bool preprocess(istream& i, const List<String>& incldirs,  
  2.           ostream& o) {  
  3.     //...  
  4.     curline = ""           //释放curline使用的空间。  
  5.     return true;  
  6. }  

把空字符串赋值给curline变量几乎释放了curline使用的所有空闲存储空间,只有遗留微不足道的存储空间没有释放。很自然地,通过上面这种方法,对象所使用空间的释放方式取决于对象的类型。