数组类型的变量有三个重要的限制:数组长度不变,在编译时必须知道其长度,数组只在定义它的语句块内存在。实际的程序往往需要动态的分配数组。虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常是)在运行时才确定数组长度,与数组变量不同,动态分配的数组将一直在,知道程序显式释放它为止。
C语言使用一对标准的函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new 和 delete 表达式实现相同的功能。
1.动态数组的定义
动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new 表达式返回新分配数组的第一个元素的指针。
int *pia = new int[10];
此new表达式分配了一个含有10个int型元素的数组,并返回指向该数组的第一个元素的指针。
2.初始化动态分配的数组
动态分配数组时,如果数组元素类型是类类型,将使用类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化。
int *pia = new int[10];//无初始化
string *pia = new string[10];//string默认构造函数初始化
也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化
int *pia = new int[10]();//都初始化为0
3.const对象的动态数组
const int *pia_bad = new const int[10];//错误
const int *pia_ok = new const int[10]();//正确
C++允许定义类类型的const数组,但该类型必须提供默认构造函数
const string *pia_ok = new const string[10];//正确
4.动态控件的释放
动态分配的内存最后必须进行释放,否则内存最终将会逐渐耗尽。
C++语言为指针提供delete [] 表达式释放所指向的数组空间,delete [] pia_ok;
注意:在关键字delete和指针之间的空方括号对是必不可少的,它告诉编译器该指针指向的是自由存储区中的数组,而并非单个对象。如果遗漏空方括号,这是一个编译器无法发现的错误,将导致程序在运行时出错。