4.3 动态内存分配
在程序中处理固定数量的变量,这样的应用非常有限。在具体应用中,经常需要在执行期间根据程序的输入数据,决定应该给不同类型的变量分配的存储空间。对于某个数据集来说,可能在程序中使用大型的整数数组是合适的;而对于另一个数据集而言,则可能需要大型的浮点数组。任何涉及读取和处理若干事先不知道的数据项的程序,都可以利用这个功能在运行时分配内存来存储数据。例如,如果我们需要实现一个程序来存储一个班的学生的信息,由于学生数目不固定,学生名字的长度也不一样,因此要最有效地处理该数据,肯定是在执行时动态地分配空间。
显然,因为任何动态分配的变量都不可能在编译期间定义,所以源程序中将没有它们的名称。当创建这些变量时,计算机用内存中相应的地址来标识它们,该地址被存储在指针中。借助于指针的力量和Visual C++(www.cppentry.com) 2008的动态内存管理工具,我们很快且很轻松地就能使编写的程序具备这种灵活性。
4.3.1 堆的别名-- 自由存储器
大多数情况下,当程序开始执行时,计算机中有部分未被使用的内存。这些内存在C++(www.cppentry.com)中被称为堆,有时还被称为自由存储器。我们使用C++(www.cppentry.com)中的一种特殊运算符,可以在自由存储器中为特定类型的新变量分配空间。该运算符返回分配给变量的内存地址,它就是new运算符,与其配对的是delete运算符,其作用是释放先前new分配的内存。
我们可以在程序中给某些变量在自由存储器中分配空间,当不再需要这些变量时,再将分配的空间释放并返还给自由存储器。这样在相同程序的后面,这部分内存就可以被其他动态分配的变量重用。
只要需要给那些只能在运行时确定的数据项分配内存,我们就得使用来自自由存储器的内存。为容纳应用程序的用户输入的字符串而分配内存,就是一个这样的例子。我们无法预先知道这个字符串有多长,因此需要在运行时用new运算符为该字符串分配内存。稍后,我们将再看一个使用自由存储器为数组动态分配内存的例子,其中数组的大小是用户在运行时确定的。
这种技术非常强大,使我们能够非常高效地使用内存,而且在许多情况下,使用这种技术的程序可以处理许多原本不可能处理的、涉及大量数据的非常庞大的问题。