我们知道,同一个程序有的时候运行需要很大的内存空间来处理大量的数据,有的时候运行只需要处理很少量的数据,并不需要很大的内存空间,如果总是按照最大的内存需求来定义数组的话,就会造成内存空间的浪费。比较好的做法是,在程序运行时,需要多大的内存空间就开辟多大的内存空间,这就叫做动态内存分配。
在C++中,动态内存分配使用的是new运算符,可以分配一个变量也可以分配一个数组。
1.分配一个变量
语句格式为:
P = new T
T是任意的类型名,P是类型为T * 的指针。该语句动态分配出一片大小为sizeof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。如:
int * p;
p = new int;
* p = 5;
2.分配一个数组
语句格式为:
P = new T[N];
T为任意的类型名,P是类型为T * 的指针,N是要分配的数组元素的个数,可以使整形表达式。该语句动态分配出一片大小为N * sizeof(T)字节的内存空间,并将该内存空间的起始地址赋值给P。如:
int * p;
int i = 5;
p = new int[i * 20];
p[0] = 20;
p[100] = 30; //编译没问题,但运行时会导致数组下标越界。
注意,new运算符的返回值类型为T *,如:
int * p = new int;
这条语句中new的返回值类型为int *。
在编写程序时,用“new”动态分配的内存空间,一定要用“delete”运算符进行释放。否则,new出来的内存空间会一直被该程序占用,操作系统不能为其他程序分配该内存空间,如果该程序反复地动态分配存储空间而总不释放的话,该程序占用的内存空间就会越来越多,最终就会导致操作系统运行速度很慢甚至崩溃。
释放存储空间的语句格式为:
delete P;
P是一个指针,该指针必须指向new出来的空间。如:
int * p = new int;
* p = 5;
delete p;
delete p; //编译异常,一片空间不可以被delete多次。
再用“delete”释放动态分配的数组时,要加“[]”,其语句格式为:
delete [] P;
P是一个指针,该指针必须指向new出来的数组。如:
int * p = new int[20];
p[0] = 1;
delete [] p;
注意,千万不要忘记[],如果忘记会导致new出来的存储空间不会被完全释放,存储空间没有被回收的话就会成为内存的垃圾碎片,在操作系统运行过程中就不会进行分配了,等于就浪费掉了,这是我们在编程时需要避免的。