4.5.4 庞大的对象
现在让我们考虑堆栈空间。对于许多系统,一个程序可利用的堆栈空间要比可利用的空闲的储空间少很多。(而可利用的空闲存储空间要比可利用的文件系统空间少很多。)
在任何给定的时刻内,程序使用的堆栈空间总大于栈中所有对象的大小总和(当我们所说的对象的大小,是指对象执行sizeof函数后返回的大小)。如果一个程序用完了所有的堆栈空间,往往都是由于下面两个原因中的其中一个造成的:一个错误的存在,导致了无数次的递归;或者在栈中创建一个或多个很大的对象。关于庞大的对象,考虑下面的代码:
- class Huge {
- char buf[1024 * 1024]; //1兆字节的对象。
- //...
- };
如果程序在栈中创建一个Huge对象,很可能它(这个程序)会用完所有的堆栈空间。幸运的是,我们很少会创建一个如此大的对象。如果真地想要创建一个这样的对象,或者用户程序可能需要在栈中创建一个这样的对象,那么我们就应该从空闲存储空间分配所需要的内存空间,而不是从堆栈空间分配这些空间: - class Huge_in_freestore {
- private:
- char* buf;
- public:
- Huge_in_freestore() : buf(new char[1024 * 1024]) {
- //...
- }
- ~Huge_in_freestroe() {
- delete[] buf;
- }
- //...
- };
如4.5.2小节所讨论的那样,我们必须牢记要尽快地删除从空闲存储空间分配的对象。在这里,我们在类的析构函数中删除了Huge_in_freestore::buf对象。