4.3.2 new和delete运算符
假设某个double变量需要空间。我们可以定义一个指向double类型的指针,然后在运行时再请求分配内存。这项任务可以在下面的语句中用new运算符来完成:
- double* pvalue = NULL; // Pointer initialized with null
- pvalue = new double; // Request memory for a double variable
现在是复习"所有指针都应该初始化"这条原则的好时机。动态使用内存通常涉及大量四处漂浮的指针,因此确保它们不包含虚假值非常重要。如果指针没有包含合法的地址值,我们就应该设法将其设置为0。
前面第二行代码中的new运算符应该返回自由存储器中分配给double变量的内存地址,该地址被存入到指针pvalue中。之后,使用前面学过的间接运算符,我们可以通过指针pvalue来引用那个double变量。例如:
- *pvalue = 9999.0;
当然,系统或许没有分配我们请求的内存,原因可能是自由存储器中的内存已经用光,或者自由存储器由于前面的使用而破碎-- 即没有足够的连续字节提供给需要获得空间的变量。不过,我们不必过多担心这一点。在ANSI C++(www.cppentry.com)标准中,如果系统因故不能分配内存,new运算符将抛出一个异常,从而使程序终止。异常是C++(www.cppentry.com)中报告错误的机制,我们将在第6章学习异常。
new创建的变量也可以初始化。以前面new分配的double变量为例,其地址存储在pvalue中,我们可以用下面这条语句,在创建该变量的同时将其初始化为999.0:
- pvalue = new double(999.0); // Allocate a double and initialize it
当我们不再需要动态分配的某个变量时,可以用delete运算符将其占用的内存释放到自由存储器中:
- delete pvalue; // Release memory pointed to by pvalue
这样将确保这块内存以后可以被另一个变量使用。如果我们不使用delete,随后又在pvalue指针中存入一个不同的地址值,那么将无法再释放这块内存,或使用其包含的变量,因为我们失去了访问该地址的途径。这种情况被称为内存泄漏-- 特别是出现在用户程序中的时候。